加入多个表MongoDB并返回合并结果

时间:2017-10-29 14:20:51

标签: mongodb nosql mongodb-query

我有两个集合,一个是用户,另一个是地址。 用户文档包含包含publicId地址的列表。

我正在编写一个API来获取用户。如何返回用户和地址文档的合并结果?

用户:

{    
    "_id" : ObjectId("5684f3c454b1fd6926c324fd"),
    "email" : "user@example.com",
    "userId" : "userId",
    "addresses" : ["A1234","A5678"]
}

地址:

{
    "_id" : ObjectId("56d82612b63f1c31cf906004"),
    "publicId" : "A1234"
    "addressLine1" : "AD1",
    "addressLine2" : "AD1",
    "pin" : "001"
}
{
    "_id" : ObjectId("56d82612b63f1c31cf906005"),
    "publicId" : "A5678"
    "addressLine1" : "AD2",
    "addressLine2" : "AD2",
    "pin" : "002"
}

我想要实现的是

{
 "_id" : ObjectId("5684f3c454b1fd6926c324fd"),
 "email" : "user@example.com",
 "userId" : "userId",
 "addresses" : [
  {
   "publicId" : "A1234"
   "addressLine1" : "AD1",
   "addressLine2" : "AD1",
   "pin" : "001"
  },
  {
   "publicId" : "A5678"
   "addressLine1" : "AD2",
   "addressLine2" : "AD2",
   "pin" : "002"
  }
 ]
}

如何使用聚合查询实现此目的?

2 个答案:

答案 0 :(得分:1)

为此您可以使用聚合框架中的$lookup stage

db.user.aggregate([ 
      {$lookup: 
        {
          from : 'addresses', 
          localField: 'Addresses', 
          foreignField: 'publicId', 
          as: 'Addresses'
        }
      }, 
      {$project: {'Addresses._id': 0} }  
]).pretty()

使用$ lookup(类似于左外连接),您需要使用MongoDB 3.2或更高版本。

答案 1 :(得分:0)

我得到了它的工作。以下是我使用的聚合查询。

db.user.aggregate([
   {
      $unwind: "$addresses"
   },
   {
      $lookup:
         {
            from: "address",
            localField: "addresses",
            foreignField: "publicId",
            as: "addresses"
        }
   },
   {
      $match: { 
          "userId":"userId",
          "addresses": { $ne: [] }
          }
   }
])
相关问题