首页 文章

过滤子文档和触发器

提问于
浏览
0

我在邀请中收集了对象,很难过滤特定对象并触发它的布尔字段 .

Document:

"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数组中只有两个对象,它可以是两个以上 . 假设 personApersonB 发送邀请,所以两个不同的邀请对象被插入到具有不同字段的数据库中,两个人的 objectId (上述文档中的 userID ),现在如果我只接受personA的邀请,它应该只有 trigger accepted field 的personA对象,这是我到目前为止所尝试的,但没有按照期望工作 .

Controller:

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);
    });

});

最后我正在寻找一个可用于过滤 single element or object 的查询,就像我接受 personA 的邀请一样,接受personA对象的接受字段应该设置为true . 如果提供一些逻辑,我会非常有帮助 . 谢谢

2 回答

  • 1

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

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

    这是"projection"上下文中positional $运算符的形式 . 只返回"singular"匹配的元素 .

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

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

    Update on Aggregate in Mongodb

    Toggle boolean value of subdocuments

    personA.userID 或任何使它工作的东西 .

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

  • 1

    你可以这样做:

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

    将值1替换为要更新的用户标识 .

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

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

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

相关问题