【问题标题】:Mongodb $lookup with nested document带有嵌套文档的 Mongodb $lookup
【发布时间】:2018-11-14 18:43:24
【问题描述】:

我正在尝试使用 mongo 的查找来创建连接。我有这三个系列。

订单跟踪

{   
    _id: ObejctId("59fb7815b3b8429f4750b0df"),
    itemName : "Hamam Soap",
    TrackLocation: [{locationId: 1, at:"2017-10-11"},
            {locationId: 2,at:"2017-10-13"}],
    userId : 12,
    price: 20
} 

位置类型

{
    _id: ObejctId("59b2111345cb72345a35fefd"),
    locationId : 1
    productTypeName: "Warehouse"
},{
    _id: ObejctId("59af8ce445cb72345a35feea"),
    locationId : 2
    productTypeName: "On Transit"
}

用户

{
    _id: ObejctId("59a504eb6171b554c02292a9"),
            "user ID":12,
    "userName" : "Shahabaz Shafi",
    "dateOfBirth" : "1992-01-01",
    "addres": {
        "country" : "India",
        "state" : "Karnataka",
        "city" :  "Bengaluru"
    }

}

并尝试将其扁平化为这种输出。

{
"userName" : "Shahabaz Shafi",
"userId":12,
"dateOfBirth" : "1992-01-01",
"country" : "India",
"state" : "Karnataka",
"city" :  "Bengaluru"

"locationType" : [ {productTypeName: "Warehouse",at:"2017-10-11"}, {productTypeName: "On Transit",at:"2017-10-13"}]
}

编辑:15-11-2018 更新输出

对输出列进行了一些更改

{
   "userName":"Shahabaz Shafi",
   "userId":12,
   "dateOfBirth":"1992-01-01",
   "country":"India",
   "state":"Karnataka",
   "city":"Bengaluru",
   "items":[
      {
         "itemName":"Hamam Soap",
         "userId":12,
         "price":20,
         "TrackLocation":[
            {
               "locationId":1,
               "at":"2017-10-11",
               "productTypeName":"Warehouse"
            },
            {
               "locationId":2,
               "at":"2017-10-13",
               "productTypeName":"On Transit"
            }
         ]
      }
   ]
}

我该如何处理?

PS:我也在用指南针

【问题讨论】:

  • Orders TrackLocation.locationId 使用 locationType 的 locationId 查找,然后 Orders userId 再次使用 Users userId 列查找。我之前在用户表中错过了用户 ID 列,现在我添加了它。

标签: mongodb mongodb-query aggregation-framework mongodb-compass


【解决方案1】:

您可以将以下聚合与 mongodb 3.6 及更高版本一起使用

db.User.aggregate([
  { "$lookup": {
    "from": "orderTracking",
    "let": { "userId": "$userId" },
    "pipeline": [
      { "$match": { "$expr": { "$eq": ["$userId", "$$userId"] }}},
      { "$unwind": "$TrackLocation" },
      { "$lookup": {
        "from": "locationType",
        "let": { "location": "$TrackLocation.locationId" },
        "pipeline": [
          { "$match": { "$expr": { "$eq": ["$locationId", "$$location"] }}}
        ],
        "as": "locationType"
      }},
      { "$project": {
        "_id": 0,
        "productTypeName": { "$arrayElemAt": ["$locationType.productTypeName", 0] },
        "at": "$TrackLocation.at"
      }}
    ],
    "as": "locationType"
  }},
  { "$replaceRoot": { "newRoot": { "$mergeObjects": ["$addres", "$$ROOT"] }}},
  { "$project": { "addres": 0 }}
])

Output

[
  {
    "_id": ObjectId("59a504eb6171b554c02292a9"),
    "city": "Bengaluru",
    "country": "India",
    "dateOfBirth": "1992-01-01",
    "locationType": [
      {
        "at": "2017-10-11",
        "productTypeName": "Warehouse"
      },
      {
        "at": "2017-10-13",
        "productTypeName": "On Transit"
      }
    ],
    "state": "Karnataka",
    "userId": 12,
    "userName": "Shahabaz Shafi"
  }
]

【讨论】:

  • 我得到 { "_id" : ObjectId("5bed1d5a61e4044a7cedcb89"), "userId" : 12, "userName" : "Shahabaz Shafi", "dateOfBirth" : "1992-01-01", “地址”:{“国家”:“印度”,“州”:“卡纳塔克邦”,“城市”:“班加罗尔”},“locationType”:[{“at”:ISODate(“2017-10-10T18:30 :00Z") } ] } 我刚刚运行了相同的查询,此查询中缺少其余值我错过了什么吗?
  • 请检查链接中的输出。我已经发布了您的收藏并运行了查询。效果很好。
  • 代码工作得很好,你是明星。当我尝试在最后添加几列时,我遇到了一些语法问题。我以某种方式努力获得相同的项目名称和价格,我尝试将它们添加到最后的项目步骤,但它重复了两次,我如何只得到一次?我已经更新了输出。
  • 您没有使用示例集合更新您的问题。您刚刚使用示例输出对其进行了更新。怎么不能产生预期的输出。如果您提出一个新问题并接受上述问题,那会更好。
  • 无法产生预期的输出是吗?一般来说,我应该能够将所有“orderTracking”列添加到输出中,这将回答我的问题。
猜你喜欢
  • 2019-03-20
  • 2020-12-29
  • 2019-04-29
  • 1970-01-01
  • 2020-12-31
  • 2020-11-26
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
相关资源
最近更新 更多