如何根据子文档的_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 } }