如何在另一个集合中搜索一些mongoose集合?

时间:2018-05-30 09:09:34

标签: node.js mongodb mongoose

我有两个猫鼬收藏品。我们考虑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}
  

收藏-2

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

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

3 个答案:

答案 0 :(得分:2)

使用$ lookup:

  

$ lookup在3.2版中新增。

     

在同一个中执行左外部联接到未整数的集合   数据库从“已加入”集合中过滤文档   处理。对于每个输入文档,$ 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
          }
    }
]);

答案 1 :(得分:2)

  

collection1

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

collection2

{'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'}
         }
    }
])

答案 2 :(得分:1)

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

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