Переименовать поле на конвейере агрегации $ project - PullRequest
0 голосов
/ 31 октября 2018

Мне нужно переименовать поле документа из моего массива. Это мой документ:

"_id" : ObjectId("5bda09a090ecff10f7275781"),
"color" : "blue",
"levels" : [
    {
        "level" : 1,
        "tag" : "AB"
    },
    {
        "level" : 2,
        "tag" : "AA"
    },
    {
        "level" : 3,
        "tag" : "BB"
    }
]

Мне нужно переименовать поле вложенного документа level в indice на моей стадии $ проекта, но я не добился успеха.

Вот моя агрегатная функция и нежелательный результат:

db.test.aggregate({$project: {color:1, 'levels.tag':1, 'levels.indice': '$levels.level'}}).pretty()

Нежелательный результат:

"_id" : ObjectId("5bda09a090ecff10f7275781"),
"color" : "blue",
"levels" : [
    {
        "tag" : "AB",
        "indice" : [
            1,
            2,
            3
        ]
    },
    {
        "tag" : "AA",
        "indice" : [
            1,
            2,
            3
        ]
    },
    {
        "tag" : "BB",
        "indice" : [
            1,
            2,
            3
        ]
    }
]

Я просто надеюсь, что следующий результат:

"_id" : ObjectId("5bda09a090ecff10f7275781"),
"color" : "blue",
"levels" : [
    {
        "indice" : 1,
        "tag" : "AB"
    },
    {
        "indice" : 2,
        "tag" : "AA"
    },
    {
        "indice" : 3,
        "tag" : "BB"
    }
]

Кто-нибудь может мне помочь? Большое спасибо!

1 Ответ

0 голосов
/ 31 октября 2018

Используйте $map для перебора уровней и переименования поля. $addFields для сохранения всех существующих полей.

db.test.aggregate({
  "$addFields":{
    "levels":{
      "$map":{
        "input":"$levels",
        "in":{
          "indice":"$$this.level",
          "tag":"$$this.tag"
        }
      }
    }
  }
})
...