我在邀请函中有对象集合,很难过滤特定对象并触发它的布尔字段。
文件:
"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。 如果提供一些逻辑,我会非常有帮助。 谢谢
答案 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
或任何使其有效的内容。
只需使用您希望与查询条件匹配的“用户”的唯一标识符。