【问题标题】:How to flatten an aggregate result [duplicate]如何展平聚合结果[重复]
【发布时间】:2019-11-15 21:54:10
【问题描述】:

MongoDB:3.6+

我有这个 Pymongo/MongoDB 查询:

    _data = db['history'].aggregate([
        {'$lookup': 
            {
                'from': 'mgmt_item',
                'localField': 'id_mgmt_item',
                'foreignField' : 'old_id',
                'as': 'mgmt_item'
            }
        },
        {'$match': query},
        {'$project': projection}
    ])

我得到以下结果,这是正确的。

{ 
   "_id":"a4f2a993-749d-4b27-a9bd-c5950babd1bf",
   "id_mgmt_item":3,
   "value":99.660095,
   "image_path":"https://url/a4f2a993-749d-4b27-a9bd-c5950babd1bf.jpg",
   "mgmt_item":[ 
      { 
         "lang":{ 
            "pt_BR":"Descrição..."
         }
      }
   ]
}

但是,我想展平结果以将 mgmt_item.lang.pt_BR 的值作为 mgmt_item 属性的值,如下所示:

{ 
   "_id":"a4f2a993-749d-4b27-a9bd-c5950babd1bf",
   "id_mgmt_item":3,
   "value":99.660095,
   "image_path":"https://url/a4f2a993-749d-4b27-a9bd-c5950babd1bf.jpg",
   "mgmt_item":"Descrição..."
}

我应该在查询中做哪些更改以获得所需的结果?

【问题讨论】:

  • 您可以将您的输入文档添加到问题中吗?
  • 使用$addFields 阶段。 { $addFields: { mgmt_item: { $arrayElemAt: ["$mgmt_item.lang.pt_BR", 0] }}}
  • @Ashh 它就像一个魅力。谢谢。

标签: python mongodb pymongo


【解决方案1】:

您可以将以下 $replaceRoot 阶段添加到聚合列表的末尾以根据需要进行展平:

  {
    $replaceRoot: {
      newRoot: {
        $mergeObjects: [
          "$$ROOT",
          {
            "mgmt_item": {
              $arrayElemAt: [
                "$mgmt_item.lang.pt_BR",
                0
              ]
            }
          },
        ]
      }
    }
  }

游乐场:

https://mongoplayground.net/p/iR8Qoc3TkXU

文档:

https://docs.mongodb.com/manual/reference/operator/aggregation/replaceRoot/

https://docs.mongodb.com/manual/reference/operator/aggregation/arrayElemAt/

【讨论】:

    猜你喜欢
    • 2018-09-02
    • 2020-10-25
    • 2022-11-30
    • 2013-02-16
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    相关资源
    最近更新 更多