过滤子文档和触发器
Filter subdocument and trigger
我有邀请中的对象集合,很难过滤特定对象并触发它的布尔字段。
文档:
"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
}
]
这里我在邀请数组中只有两个对象,它可以超过两个。
假设 personA 和 personB 向我发送邀请,因此两个不同的邀请对象被插入到具有不同字段的数据库中,objectId 两个人(userID 在上面的文档中),现在如果我只接受 personA 的邀请,它应该 trigger accepted field of 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[=31= 的邀请一样] 那么 personA 对象的 Accepted 字段应该设置为 true。
如果提供一些逻辑,我会很有帮助。
谢谢
你可以这样做:
db.user.update({"invitation.userID": 1}, {"$set" : {"invitation.$.Accepted" : true}});
将值 1 替换为您要更新的用户 ID。
代码是MongoShell的语法,直接转换成你用的驱动语法就可以了
使用的运算符是$
。根据文档:位置 $ 运算符标识数组中要更新的元素,而无需明确指定元素在数组中的位置。要投影或 return 来自读取操作的数组元素,请参阅 $ 投影运算符。
有关详细信息,请参阅:http://docs.mongodb.org/manual/reference/operator/update/positional/
不是很清楚的问题。但似乎您在这里真正需要做的只是首先匹配您想要更新的唯一子文档:
User.find(
{
"_id": "req.user._id",
"Invitation._id": personA.id
},
{ "Invitation.$": 1 },
function(err,docs) {
// and continue
}
);
这是 "projection" 上下文中 positional $
运算符的形式。其中仅返回 "singular" 匹配的元素。
一旦得到 "singular" 结果,所有其他代码都将按设计工作。
毕竟我应该知道,因为我是为你写的。并不是说您对此表示任何体面的尊重。
Toggle boolean value of subdocuments
或personA.userID
或任何使它起作用的东西。
只需使用您希望匹配查询条件的 "user" 的唯一标识符。
我有邀请中的对象集合,很难过滤特定对象并触发它的布尔字段。
文档:
"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
}
]
这里我在邀请数组中只有两个对象,它可以超过两个。 假设 personA 和 personB 向我发送邀请,因此两个不同的邀请对象被插入到具有不同字段的数据库中,objectId 两个人(userID 在上面的文档中),现在如果我只接受 personA 的邀请,它应该 trigger accepted field of 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[=31= 的邀请一样] 那么 personA 对象的 Accepted 字段应该设置为 true。 如果提供一些逻辑,我会很有帮助。 谢谢
你可以这样做:
db.user.update({"invitation.userID": 1}, {"$set" : {"invitation.$.Accepted" : true}});
将值 1 替换为您要更新的用户 ID。
代码是MongoShell的语法,直接转换成你用的驱动语法就可以了
使用的运算符是$
。根据文档:位置 $ 运算符标识数组中要更新的元素,而无需明确指定元素在数组中的位置。要投影或 return 来自读取操作的数组元素,请参阅 $ 投影运算符。
有关详细信息,请参阅:http://docs.mongodb.org/manual/reference/operator/update/positional/
不是很清楚的问题。但似乎您在这里真正需要做的只是首先匹配您想要更新的唯一子文档:
User.find(
{
"_id": "req.user._id",
"Invitation._id": personA.id
},
{ "Invitation.$": 1 },
function(err,docs) {
// and continue
}
);
这是 "projection" 上下文中 positional $
运算符的形式。其中仅返回 "singular" 匹配的元素。
一旦得到 "singular" 结果,所有其他代码都将按设计工作。
毕竟我应该知道,因为我是为你写的。并不是说您对此表示任何体面的尊重。
Toggle boolean value of subdocuments
或personA.userID
或任何使它起作用的东西。
只需使用您希望匹配查询条件的 "user" 的唯一标识符。