繁体   English   中英

Mongodb 将字段复制到另一个集合

[英]Mongodb copy field to another collection

假设我有收集orders

{
   "id":"1",
   "items":{
      "itemId":"1000",
      "name":"Item 1",
      "status":"STATUS"
   }
}
{
   "id":"2",
   "items":{
      "itemId":"1000",
      "name":"Item 1",
      "status":"ANOTHER_STATUS"
   }
}

我也有收集item_projections这是

{
   "id":"1",
   "itemId":"1000",
   "name":"Item 1",
   "orderId":"1"
}
{
   "id":"1",
   "itemId":"1000",
   "name":"Item 1",
   "orderId":"2"
}

对于收集orders中的每个项目,我想将字段status复制到投影以匹配订单iditemId

{
   "id":"1",
   "itemId":"1000",
   "name":"Item 1",
   "orderId":"1",
   "status":"STATUS"
}
{
   "id":"1",
   "itemId":"1000",
   "name":"Item 1",
   "orderId":"2",
   "status":"ANOTHER_STATUS"
}

是否可以通过聚合查找和合并管道来做到这一点?

解决方案 1

  1. $lookup - item_projections集合(键: orderId )加入orders集合(键: id )并返回orders数组字段和status字段的文档。

  2. $replaceRoot - 用新文档替换输入文档。

    2.1。 $mergeObjects - 将根文档与orders的第一个文档合并。

  3. $unset - 删除orders字段。

db.item_projections.aggregate([
  {
    "$lookup": {
      "from": "orders",
      "localField": "orderId",
      "foreignField": "id",
      "pipeline": [
        {
          $project: {
            status: "$items.status"
          }
        }
      ],
      "as": "orders"
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          "$$ROOT",
          {
            $first: "$orders"
          }
        ]
      }
    }
  },
  {
    $unset: "orders"
  }
])

示例 Mongo Playground(解决方案 1)


解决方案 2

或者您可以用$project替换第二和第三阶段。

{
  $project: {
    "id": 1,
    "itemId": 1,
    "name": 1,
    "orderId": 1,
    "status": {
      $first: "$orders.status"
    }
  }
}

示例 Mongo Playground(解决方案 2)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM