【问题标题】:How can I handle array intersection in find({})?如何处理 find({}) 中的数组交集?
【发布时间】:2013-11-08 01:18:17
【问题描述】:

有一个数组,例如:

var arr = ["1","1.1","1.3","2","2.1","2.2","2.3"]

还有一个 Collection A,就像这样

[ {_id:"1",儿童:["1.1","1.4"]}, {_id:"2",儿童:["2.1","2.2"]}, {_id:"3",children:["3.1","3.2"]} ]

查找({....})
我想得到结果 [ {_id:"1",儿童:["1.1"]}, {_id:"2",儿童:["2.1","2.2"]}, ]

结果子数组是arr和集合Achildren的交集

如何设置查询运算符?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    这也不是您正在寻找的确切答案,但您可以使用$in 运算符:

    db.i.find({
      children : { $in : arr}
    })
    

    请记住,这不会产生上述结果(它会输出数组中的所有值,而不是{_id:"1",children:["1.1"]},)。

    但是您可以按照我的建议,然后在您的应用程序中遍历所有结果并仅输出子节点与您的数组的交集。

    【讨论】:

    • 所以基本上,这里的结果与您想要的不同? :)
    • @AsyaKamsky 不,我不知道如何在 mongo 中实现 OP 想要的一切,所以我给了他一个解决方案,它制作一个 mongoquery,然后需要做一些应用程序逻辑,并会达到他的结果想要。但我很高兴你提供了一个完整的解决方案,也很高兴给你 +1
    • 我也没有给他他想要的东西(因此:))但当然一个简单的“发现”不能满足他的要求......所以我们都在同一条船上在这方面。
    • 根据文档中的reference,现在这是进行他想要的查询的正确方法。我添加此评论仅供将来参考。
    【解决方案2】:

    您无法通过简单的查询(查找)获得您想要的结果,但您可以使用聚合框架来实现。方法如下:

    var arr = ["1","1.1","1.3","2","2.1","2.2","2.3"]
    
    db.A.aggregate([ { "$unwind" : "$children" }, 
                     { "$match"  : { "children" : { "$in" : arr } } },
                     { "$group"  : { "_id" : "$_id", "children" : { "$push" : "$children" } } }
                   ]
    );
    

    样本数据的结果:

    { "_id" : "2", "children" : [  "2.1",  "2.2" ] }
    { "_id" : "1", "children" : [  "1.1" ] }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-22
      • 1970-01-01
      • 2022-08-18
      • 2017-02-22
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多