过滤子文档和触发器

时间:2015-01-21 10:19:40

标签: node.js mongodb mongoose mongodb-query aggregation-framework

我在邀请函中有对象集合,很难过滤特定对象并触发它的布尔字段。

文件:

"Invitation" : [ 
{
    "__v" : 0,
    "userID" : ObjectId("54afaabd88694dc019d3b628"),//ObjectId of personA
    "__t" : "USER",
    "_id" : ObjectId("54b5022b583973580c706784"),
    "Accepted" : false
}, 
{
    "__v" : 0,
    "userID" : ObjectId("54af6ce091324fd00f97a15f"),//ObjectId of personB
    "__t" : "USER",
    "_id" : ObjectId("54bde39cdd55dd9016271f14"),
    "Accepted" : false
}
]

这里我在Invitation数组中只有两个对象,它可以超过两个。 假设 personA personB 向我发送邀请,因此将两个不同的邀请对象插入到具有不同字段的数据库中,两个人的 objectId (<上面文档中的strong> userID ,现在如果我只接受personA的邀请,它应该仅触发personA对象的接受字段,这是我到目前为止所尝试的,但不是作为期望。

控制器:

User.find({_id: req.user._id},'Invitation',function(err,docs) {
if (err) {
    console.log(err);
}
    var results = [];

    async.each(docs,function(doc,callback) {

        async.each(doc.Invitation,function(invite,callback) {
            User.findOneAndUpdate(
                {'_id': doc._id, 'Invitation._id': invite._id},
                {'$set': {'Invitation.$.Accepted': !invite.Accepted}},
                function(err,doc) {
                    results.push(doc);
                    callback(err);
                }
            );
        },callback);
    },function(err) {
        if (err)
            console.log(err);

        console.log('end'+results);
    });

});

最后我正在寻找一个可用于过滤单个元素或对象的查询,就像我接受 personA 的邀请一样,那么personA对象的接受字段应该是设置为true。 如果提供一些逻辑,我会非常有帮助。 谢谢

2 个答案:

答案 0 :(得分:1)

你可以这样做:

db.user.update({"invitation.userID": 1}, {"$set" : {"invitation.$.Accepted" : true}});

将值1替换为您要更新的用户ID。

代码采用MongoShell的语法,只需转换为您正在使用的驱动程序语法

使用的运算符是$。根据文档:位置$运算符标识要更新的数组中的元素,而不显式指定元素在数组中的位置。要从读取操作中投影或返回数组元素,请参阅$ projection运算符。

有关详细信息,请参阅:http://docs.mongodb.org/manual/reference/operator/update/positional/

答案 1 :(得分:1)

不是一个非常明确的问题。但看起来你真正需要做的就是首先匹配你想要更新的唯一子文档:

User.find(
   { 
       "_id": "req.user._id",
       "Invitation._id": personA.id
   },
   { "Invitation.$": 1 },
   function(err,docs) {
     // and continue
   }
);

这是“投影”上下文中positional $运算符的形式。只返回“单数”匹配元素。

一旦你得到“单数”结果,那么所有其他代码都按设计工作。

毕竟我应该知道,因为我是为你写的。并不是说你对此表示尊重。

Update on Aggregate in Mongodb

Toggle boolean value of subdocuments

personA.userID或任何使其有效的内容。

只需使用您希望与查询条件匹配的“用户”的唯一标识符。