【问题标题】:How to search one mongoose collection with some conditions on another collection? [duplicate]如何在另一个集合的某些条件下搜索一个猫鼬集合? [复制]
【发布时间】:2018-05-30 09:09:33
【问题描述】:

我有两个猫鼬系列。让我们考虑collection-1collection-2。他们的数据类似于以下数据

collection-1:

{'name': 'Tom', 'age':20, 'bank-acc':1111}, 
{'name': 'Dick', 'age':25, 'bank-acc':2222},
{'name': 'Hary', 'age':22, 'bank-acc':3333}

Collection-2

{'bank-acc':1111, 'balance':100},
{'bank-acc':2222, 'balance':200},
{'bank-acc':3333, 'balance':300}

现在我想同时查询这两个集合以从集合 1 中获取年龄大于 20 并且在集合 2 中余额大于 100 的名称。 有人建议我,因为这是 MongoDB,它是一个 NO-SQL 数据库,所以我应该将这两个表合并为一个,然后尝试查询它,但在我的情况下,将这两个表与真实模式合并是非常不可行的.我可能会使用查找或类似关键字的聚合查询,但我在很多地方搜索过,但在找到这个问题的答案时不知道要搜索什么。任何人都可以提供一个示例聚合查询来一次搜索两个表吗?

【问题讨论】:

  • 这与stackoverflow.com/questions/36459983/… 的问题不同,因为我的问题是关于在一个查询中查询两个集合以获得单个集体结果,而另一个提到的问题有类似的答案,但问题是完全不同

标签: node.js mongodb mongoose


【解决方案1】:

使用 $lookup:

$lookup 3.2 版中的新功能。

对同一个非分片集合执行左外连接 数据库从“joined”集合中过滤文档 加工。 $lookup 阶段为每个输入文档添加一个新数组 其元素是来自“已加入”的匹配文档的字段 收藏。 $lookup 阶段将这些重新调整的文档传递给 下一阶段。

试试这样的:

db.getCollection('collection1').aggregate([
    {   $lookup:
            {
            from: "collection2",
            localField: "bank-acc",
            foreignField: "bank-acc",
            as: "collection2_doc"
            }
    },
        {
            "$unwind": {
              path: "$collection2_doc",
              preserveNullAndEmptyArrays: false
            }
        },

        {
        $match : {
          name: "Tom", //field from collection1
          "collection2_doc.ballance": {$gt: 100} //field from collection2
          }
    }
]);

【讨论】:

    【解决方案2】:

    集合1

    {'name': 'Tom', 'age':20, 'bank-acc':1111},   
    {'name': 'Dick', 'age':25, 'bank-acc':2222},  
    {'name': 'Hary', 'age':22, 'bank-acc':3333}
    

    集合2

    {'bank-acc':1111, 'balance':100},
    {'bank-acc':2222, 'balance':200},  
    {'bank-acc':3333, 'balance':300}  
    
    
     db.getCollection('collection1').aggregate([
        {
            $match:{age:{$gt:20} }
        },
        {
            $lookup:{
               from:'collection2',
               localField:"bank-acc",
               foreignField:'bank-acc',
               as:'balance'
             }
        },
        {
             $unwind:'$balance'
        },
        {
             $match:{
                 'balance.balance':{$gt:200}
             }
        },
        {
             $group:{
                 _id:null,
                 names:{$push:'$name'}
             }
        }
    ])
    

    【讨论】:

      【解决方案3】:

      您可以在聚合函数上使用 $lookup 来查询多个集合:

      db.getCollection('collection1').aggregate([{
              $lookup:{
                  from:"collection2",
                  localField:"name",
                  foreignField:"bank-acc",
                  as:"bank"
              }
          },
          {
              $match:{'bank-acc' : 1111.0}
          }])
      

      【讨论】:

        猜你喜欢
        • 2022-08-08
        • 2014-12-26
        • 1970-01-01
        • 2021-02-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 2019-05-22
        相关资源
        最近更新 更多