如何根据子文档的_id 查询父级?
How to query parent based on subdocument's _id?
考虑以下记录:
用户记录
{
"_id" : ObjectId("5234ccb7687ea597eabee677"),
"class" : [
{ "_id" : ObjectId("5234ccb7687ea597eabee671", "num" : 10, "color" : "blue" },
{ "_id" : ObjectId("5234ccb7687ea597eabee672", "num" : 100, "color" : "blue" }
]
}
此用户有两个 class 子记录,现在 我需要一个查询来查找具有 class 属性 的所有用户,其中 "class._id" 具有至少一个用户的值 "class._id"
这里有一个更详细的例子:
假设有四个用户:
A:{_id:432645624232345,class:[{_id:123,name:'foo'}]}
B:{_id:432645624232555,class:[{_id:555,name:'foo'},{_id:123,name:'foo'}]}
C:{_id:432645344232345,class:[{_id:555,name:'foo'},{_id:111,name:'www'}]}
D:{_id:432644444232345,class:[{_id:222,name:'sss'},{_id:555,name:'www'},{_id:123,name:'foo'}]}
现在如果 B 登录,我需要查询所有 class 子文档至少包含一个 _id==555 或 _id==123(555 和 123 来自 B 用户)的文档的用户,在这种情况下查询结果应该是:
A:{_id:432645624232345,class:[{_id:123,name:'foo'}]} // match _id=123
B:{_id:432645624232555,class:[{_id:555,name:'foo'},{_id:123,name:'foo'}]} //match _id=123 and _id=555
C:{_id:432645344232345,class:[{_id:555,name:'foo'},{_id:111,name:'www'}]} //match _id=555
D:{_id:432644444232345,class:[{_id:222,name:'sss'},{_id:555,name:'www'},{_id:123,name:'foo'}]} ///match _id=123 and _id=555
这是所有用户。
到目前为止我明白了:
{"class._id" : { $in : ["5234ccb7687ea597eabee671", "5234ccb7687ea597eabee672"] } }
但不同用户登录时class._id查询条件不同。那么有没有运营商可以做到这一点
{"class._id" : { $in : req.user.class } }
希望我说清楚了。
以下查询条件将为您提供至少一个 class 的所有用户,其 id 等于给定数组中的任何元素:
{"class._id" : { $in : ["5234ccb7687ea597eabee671", "5234ccb7687ea597eabee672"] } }
在 $in
子句的数组中,您可以提供所需的任何 ID,以逗号分隔。
此外,如果您需要这样,下面的查询条件应该检查 "class" 属性 中是否存在具有 属性 "_id" 的嵌套文档:
{ "class._id" : { $exists : true } }
无论 "class._id"
是单值 属性 还是数组(mongo 支持),这两个条件都应该有效。
为了达到你想要的效果,首先你必须将 class _ids 隔离在一个数组中,然后在查询参数中使用它。
var classIds = [];
var i = 0;
while (i < req.user.class.length) {
classIds.push(req.user.class[i]._id);
i++;
}
之后您可以在查询中使用 classIds 数组:
{"class._id" : { $in : classIds } }
考虑以下记录:
用户记录
{
"_id" : ObjectId("5234ccb7687ea597eabee677"),
"class" : [
{ "_id" : ObjectId("5234ccb7687ea597eabee671", "num" : 10, "color" : "blue" },
{ "_id" : ObjectId("5234ccb7687ea597eabee672", "num" : 100, "color" : "blue" }
]
}
此用户有两个 class 子记录,现在 我需要一个查询来查找具有 class 属性 的所有用户,其中 "class._id" 具有至少一个用户的值 "class._id"
这里有一个更详细的例子:
假设有四个用户:
A:{_id:432645624232345,class:[{_id:123,name:'foo'}]}
B:{_id:432645624232555,class:[{_id:555,name:'foo'},{_id:123,name:'foo'}]}
C:{_id:432645344232345,class:[{_id:555,name:'foo'},{_id:111,name:'www'}]}
D:{_id:432644444232345,class:[{_id:222,name:'sss'},{_id:555,name:'www'},{_id:123,name:'foo'}]}
现在如果 B 登录,我需要查询所有 class 子文档至少包含一个 _id==555 或 _id==123(555 和 123 来自 B 用户)的文档的用户,在这种情况下查询结果应该是:
A:{_id:432645624232345,class:[{_id:123,name:'foo'}]} // match _id=123
B:{_id:432645624232555,class:[{_id:555,name:'foo'},{_id:123,name:'foo'}]} //match _id=123 and _id=555
C:{_id:432645344232345,class:[{_id:555,name:'foo'},{_id:111,name:'www'}]} //match _id=555
D:{_id:432644444232345,class:[{_id:222,name:'sss'},{_id:555,name:'www'},{_id:123,name:'foo'}]} ///match _id=123 and _id=555
这是所有用户。
到目前为止我明白了:
{"class._id" : { $in : ["5234ccb7687ea597eabee671", "5234ccb7687ea597eabee672"] } }
但不同用户登录时class._id查询条件不同。那么有没有运营商可以做到这一点
{"class._id" : { $in : req.user.class } }
希望我说清楚了。
以下查询条件将为您提供至少一个 class 的所有用户,其 id 等于给定数组中的任何元素:
{"class._id" : { $in : ["5234ccb7687ea597eabee671", "5234ccb7687ea597eabee672"] } }
在 $in
子句的数组中,您可以提供所需的任何 ID,以逗号分隔。
此外,如果您需要这样,下面的查询条件应该检查 "class" 属性 中是否存在具有 属性 "_id" 的嵌套文档:
{ "class._id" : { $exists : true } }
无论 "class._id"
是单值 属性 还是数组(mongo 支持),这两个条件都应该有效。
为了达到你想要的效果,首先你必须将 class _ids 隔离在一个数组中,然后在查询参数中使用它。
var classIds = [];
var i = 0;
while (i < req.user.class.length) {
classIds.push(req.user.class[i]._id);
i++;
}
之后您可以在查询中使用 classIds 数组:
{"class._id" : { $in : classIds } }