首页 > 解决方案 > 如何展平聚合结果

问题描述

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 attr 的值,如下所示:

{ 
   "_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..."
}

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

标签: pythonmongodbpymongo

解决方案


您可以将以下 $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/


推荐阅读