我在邀请中收集了对象,很难过滤特定对象并触发它的布尔字段 .
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数组中只有两个对象,它可以是两个以上 . 假设 personA 和 personB 发送邀请,所以两个不同的邀请对象被插入到具有不同字段的数据库中,两个人的 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 回答
不是一个非常明确的问题 . 但似乎你真正需要做的就是匹配你想要首先更新的唯一子文档:
这是"projection"上下文中positional $运算符的形式 . 只返回"singular"匹配的元素 .
一旦你得到“单数”结果,那么所有其他代码就按设计工作 .
毕竟我应该知道因为我为你写的 . 并不是说你对此表示尊重 .
Update on Aggregate in Mongodb
Toggle boolean value of subdocuments
或
personA.userID
或任何使它工作的东西 .只需使用您希望与查询条件匹配的“用户”的唯一标识符 .
你可以这样做:
将值1替换为要更新的用户标识 .
代码使用MongoShell的语法,只需转换为您正在使用的驱动程序语法
使用的运算符是
$
. 根据文档:位置$运算符标识要更新的数组中的元素,而不显式指定元素在数组中的位置 . 要从读取操作中投影或返回数组元素,请参阅$ projection运算符 .有关详细信息,请参阅:http://docs.mongodb.org/manual/reference/operator/update/positional/