如何根据子文档的_id查询父项?

时间:2015-01-17 05:58:03

标签: node.js mongodb express mongoose

考虑以下记录:

用户记录

{ 
"_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 } }
希望我清楚自己。

2 个答案:

答案 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 } }