如何在Mongodb地图中创建对象

时间:2018-11-19 09:39:17

标签: mongodb mongodb-query aggregation-framework pymongo

我有一个看起来像这样的文档,我正在使用mongo $ map在表内投影字段并重命名键。由于某些内部复杂性,我无法使用$unwind

{
"Table":[
    {"Lookup":{
        "CreatedBy":{
            "id": "User001",
            "Name":"UserName"
         }

        }
     }]
}

我期望的输出看起来像这样

{
"Table":[
    {"Lookup":{
        "CreatedBy":"UserName"
        }
     }]
}

我正在尝试使用mongo $ map实现它,但不支持

db.getCollection('TableDoc').aggregate([
        {
        "$project": {
            "Table": {
                "$map": {
                    "input": "$Table",
                    "in": {
                      "Lookup.CreatedAt": "$$this.Lookup.CreatedAt.Name",
                    }
                }               
             }
         }
        }
])

是否有其他方法可以实现而不使用$ unwind

1 个答案:

答案 0 :(得分:1)

$map支持此功能,但不使用“虚线字段路径”。相反,您使用“绝对”对象结构:

collection.aggregate([
  { "$addFields": {
    "Table": {
      "$map": {
        "input": "$Table",
        "in": {
          "Lookup": {
            "CreatedBy": "$$this.Lookup.CreatedBy.Name"
          }
        }
      }
    }
  }}
])

或者,如果对象中有很多字段,则可以在受支持的地方使用$mergeObjects

collection.aggregate([
  { "$addFields": {
    "Table": {
      "$map": {
        "input": "$Table",
        "in": {
          "$mergeObjects": [
            "$$this",
            { 
              "Lookup": {
                "CreatedBy": "$$this.Lookup.CreatedBy.Name"
              }
            }
          ]
        }
      }
    }
  }}
])

当示例显示的字段比问题中的示例显示的字段多时,这更有意义。