【问题标题】:How to query parent based on subdocument's _id?如何根据子文档的_id查询父级?
【发布时间】:2015-03-15 19:22:08
【问题描述】:

考虑以下记录:

用户记录

{ 
"_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 } }

希望我说清楚了。

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    以下查询条件将为您提供至少有一个类的所有用户,该类的 id 等于给定数组中的任何元素:

    {"class._id" : { $in : ["5234ccb7687ea597eabee671", "5234ccb7687ea597eabee672"] } }
    

    $in 子句的数组中,您可以提供任何您需要的ID,逗号分隔。

    此外,如果您需要这样,下面的查询条件应检查具有属性“_id”的“类”属性中是否存在嵌套文档:

    { "class._id" : { $exists : true } }
    

    无论"class._id" 是单值属性还是数组(mongo 支持),这两个条件都应该有效。

    【讨论】:

    • 它看起来会返回所有用户!
    • 您是在寻找特定的子类 id 还是应该只有一个 id 的子文档?
    • 假设 user.class= [{_id:123},{_id:321}],我需要找到所有 user.class= [{_id:123}] 或 user.1234562 的用户= [{_id:321}] 或 user.class= [{_id:123},{_id:321}]
    • 谢谢回复 - 如果有一个用户 user.class= [{_id:445, 889}] - 这条记录是否应该包含在结果集中?
    • 不,不应该。对不起我糟糕的英语。我想我没有清楚地描述问题
    【解决方案2】:

    为了达到你想要的,首先你必须将类_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 } }
    

    【讨论】:

    • 是的,这是可行的,但我想知道在 mongodb 中是否有内置方法来实现这一点?
    • 最接近内置方法的可能是:{"class._id" : { $in : req.user.class.map(function(item) { return item._id; })} }
    猜你喜欢
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2021-04-04
    • 2022-06-29
    • 2013-03-19
    • 2014-08-27
    相关资源
    最近更新 更多