仅在数组中的特定查询时获取和更新文档?

时间:2014-08-11 15:49:02

标签: node.js mongodb mongoose

我的mongoose请求有些麻烦!

这是我的模特:

var MessageSchema = new Schema({

...,

messages: [
    {
        user: {
            type: Schema.ObjectId,
            ref: 'User'
        },
        created: {
            type: Date,
            default: Date.now
        },
        content: String,
        readBy: [{
            type: Schema.ObjectId,
            ref: 'User'
        }]
    }
]});

有了这个,我必须知道我有多少新消息!

这是我到目前为止所做的:

    Message.find({
        ...
    })
    .select('messages.readBy')
    .exec(function(err, messages) {
        if (err) {
            // catch error
        } else {
            // On trie les messages.
            _.forEach(messages, function(msgs,i){
                var allRead = true;
                _.forEach(msgs.messages, function(msg){
                    if(msg.readBy.indexOf(id) === -1){ allRead = false; }
                });
                if(allRead) messages = _.without(messages,messages[i]);
            });

            return $socket.emit('Messages:nbNonLu', messages.length);
        }
});

但我认为当我们收到大量邮件时,这对服务器来说很难。 是否可以通过一个请求获得相同的结果? (获取messages[]不包含特定userId的所有文档。

然后是否可以更新文档 - 在userId数组中推送readBy所有messages[]

1 个答案:

答案 0 :(得分:0)

Message.find({'messages.readBy':{'$ne':id}},
       function(err,messages){
        //messages contain all messages whose readBy field does not contain the
        //specified user 
 })

将readBy中的userId推送到所有消息

Message.update({},{'$addToSet':{'messages.readBy':userId}},{multi:true},function(err,num){
        //callback
        //Add a query in the first parameter({}) if needed
})

multi:true用于更新多个文档。