Mongodb Meteor:客户端查看页面时服务器端的增量DB值

Mongodb Meteor:客户端查看页面时服务器端的增量DB值,mongodb,meteor,meteor-blaze,Mongodb,Meteor,Meteor Blaze,我试图做一些看似简单的事情,每次获取值时更新MongoDB中的视图计数器 例如,我用这种方法尝试过 Meteor.methods({ 'messages.get'(messageId) { check(messageId, String); if (Meteor.isServer) { var message = Messages.findOne( {_id: messageId}

我试图做一些看似简单的事情,每次获取值时更新MongoDB中的视图计数器

例如,我用这种方法尝试过

Meteor.methods({
    'messages.get'(messageId) {
        check(messageId, String);

        if (Meteor.isServer) {
            var message = Messages.findOne(
                {_id: messageId}
            );

            var views = message.views;

            // Increment views value
            Messages.update(
                messageId,
                { $set: { views: views++ }}
            );
        }

        return Messages.findOne(
            {_id: messageId}
        );
    },
});
但我不能让它按我的意愿工作。例如,if(Meteor.isServer)代码是无用的,因为它实际上没有在服务器上执行

此外,调用findOne后该值似乎不可用,因此它可能是异步的,但findOne没有回调功能

我不希望客户机控制这部分,这就是为什么我尝试在服务器端执行它,但每次客户机获取值时它都需要执行。这听起来很难,因为客户端已经订阅了数据

编辑:这是阅读此处答案后更新的方法

'messages.get'(messageId) {
    check(messageId, String);

    Messages.update(
        messageId,
        { $inc: { views: 1 }}
    );

    return Messages.findOne(
        {_id: messageId}
    );
},
例如,if(Meteor.isServer)代码是无用的,因为它不是 在服务器上实际执行

Meteor方法始终在服务器上执行。您可以从客户端调用它们(使用回调),但执行发生在服务器端

调用findOne后,该值似乎不可用, 所以它可能是异步的,但findOne没有回调功能

你不需要叫它两次。请参阅下面的代码:

Meteor.methods({
    'messages.get'(messageId) {
        check(messageId, String);

        var message = Messages.findOne({_id:messageId});
        if (message) {
            // Increment views value on current doc
            message.views++;
            // Update by current doc
            Messages.update(messageId,{ $set: { views: message.views }});
        }
        // return current doc or null if not found
        return message;
    },
});
您可以通过您的客户将其称为:

Meteor.call('messages.get', 'myMessageId01234', function(err, res) {
    if (err || !res) {
        // handle err, if res is empty, there is no message found
    }
    console.log(res); // your message
});
此处新增两项:


为了数据的可伸缩性和封装,您可以将消息和视图拆分为单独的集合。如果发布方法不限于公共字段,则请求消息的客户端也会收到视图计数。这可能暂时有效,但可能会在更大范围内违反某些(未来即将出现的)访问规则。

views++
表示:

  • 使用
    视图的当前值
    ,即使用当前(未修改)值构建修改器
  • 增加
    视图
    的值,该值在您的情况下不再有用,因为您不将该变量用于任何其他用途
  • 如果您不清楚这些递增运算符是如何工作的,请避免使用它们


    为什么不使用mongo
    $inc
    操作符来避免检索以前的值呢?

    您和@Jankapunkt都在这里提供了帮助,但我只能标记一个答案。从本质上讲,帮助我理解Meteor.methods始终是服务器端的,所以我不必担心客户端不增加值。而且使用$inc运营商也有帮助。我已经用我现在使用的新meteor方法代码更新了我的问题。meteor.methods确实在客户机上运行(这称为a),如果客户机知道方法代码(通过其名称)。通常,如果同时在客户端和服务器中导入方法代码。如果不希望进行模拟,只需在服务器端导入代码即可。