【问题标题】:Join Multiple Tables MongoDB and returned merged resultJoin Multiple Tables MongoDB 并返回合并结果
【发布时间】:2018-04-10 14:33:59
【问题描述】:

我有两个集合,一个是用户,另一个是地址。 用户文档有一个列表,其中包含地址的 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"
  }
 ]
}

如何使用聚合查询来实现这一点?

【问题讨论】:

    标签: mongodb nosql mongodb-query


    【解决方案1】:

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

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

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

    【讨论】:

    • 这不起作用。我还需要 $unwind,因为我有地址 ID 数组。我在我的答案中添加了有效的查询。谢谢
    • @Ganesh,奇怪,即使没有 $unwind,它也对我有用。我使用 mongodb 3.4。我还从 doc 中看到:“如果您的 localField 是一个数组,您需要在管道中添加一个 $unwind 阶段。请参阅此页面上的示例。”
    • 我试过不展开它没有给我任何结果。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-07-30
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      • 2021-11-09
      相关资源
      最近更新 更多