考虑以下记录:
用户记录
{
"_id" : ObjectId("5234ccb7687ea597eabee677"),
"class" : [
{ "_id" : ObjectId("5234ccb7687ea597eabee671", "num" : 10, "color" : "blue" },
{ "_id" : ObjectId("5234ccb7687ea597eabee672", "num" : 100, "color" : "blue" }
]
}
这个用户有两个类子记录,现在我需要一个查询,找到所有具有类属性的用户,其中" 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登录,我需要查询其类子文档至少包含一个文件的所有用户,其中_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 } }
希望我清楚自己。
答案 0 :(得分:0)
以下查询条件将为您提供至少一个id等于给定数组中任何元素的类的所有用户:
{"class._id" : { $in : ["5234ccb7687ea597eabee671", "5234ccb7687ea597eabee672"] } }
在$in
子句的数组中,您可以提供所需的任何ID,逗号分隔。
此外,如果您需要,以下查询条件应检查" class"中是否存在嵌套文档。拥有财产的财产" _id" :
{ "class._id" : { $exists : true } }
无论"class._id"
是单值属性还是数组(mongo支持),这两个条件都应该有效。
答案 1 :(得分:0)
为了达到你想要的效果,首先你必须在数组中隔离类_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 } }