【问题标题】:How to create objects inside Mongodb map如何在 Mongodb 地图中创建对象
【发布时间】:2018-11-19 09:39:17
【问题描述】:

我有一个看起来像这样的文档,我正在使用 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 的情况下实现这一点

【问题讨论】:

  • 抱歉,您这里的抽象结构无效。与其展示摘要,不如向我们展示一个真实的文档(如果您确实必须替换值)以及您期望它的样子。您不能直接在数组中使用“键名”,而只能在“对象”中使用。
  • @NeilLunn 抱歉,这是个错误。真正的文件看起来完全一样。包含嵌套对象列表的文档

标签: mongodb mongodb-query aggregation-framework pymongo


【解决方案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"
              }
            }
          ]
        }
      }
    }
  }}
])

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

【讨论】:

  • 非常感谢。像魅力一样工作。
猜你喜欢
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 2018-07-24
  • 2021-07-08
  • 2021-09-27
  • 2019-03-20
相关资源
最近更新 更多