Как создавать объекты на карте Mongodb - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть документ, который выглядит следующим образом, я использую mongo $ map для проецирования полей внутри таблицы и переименования ключа.Я не могу использовать $unwind из-за некоторой внутренней сложности.

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

        }
     }]
}

Результат, который я ожидаю, выглядит примерно так

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

Я пытаюсь добиться этого с помощью Монго $карта, но она не поддерживается

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

Есть ли другой способ добиться этого без использования $ unwind

1 Ответ

0 голосов
/ 19 ноября 2018

Это поддерживается с $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"
              }
            }
          ]
        }
      }
    }
  }}
])

Это имеет больше смысла, когда в примере показано больше полей, чем в вашем примере в вопросе.

...