Извлечение значения из объекта в массиве, соответствующего условию - PullRequest
1 голос
/ 08 июня 2019

Мне нужна помощь, чтобы создать конвейер агрегации в mongodb.

Используемая мной версия mongodb - 4.

Документы, хранящиеся в базе данных, выглядят так:

 [{
    _id : "xxxxxx",
    names : [
        { "lang" : "EN", value : "foo" },
        { "lang" : "IT", value : "bar" },
        { "lang" : "NOLANG", value : "baz" }
    ],
    some : "value"
},{
    _id : "yyyyyy",
    names : [
        { "lang" : "FR", value : "quux" },
        { "lang" : "IT", value : "quuux" },
        { "lang" : "NOLANG", value : "quuuux" }
    ],
    some : "value"
}]

Мне нужно добавить поле с агрегацией, которое содержит значение определенного языка (для этого примера я возьму «EN»), если не найден элемент с запрошенным языком, мне нужно получить значение объекта «NOLANG» .

Итак, результат агрегирования должен выглядеть так:

 [{
    _id : "xxxxxx",
    name : "foo",
    some : "value"
},{
    _id : "yyyyyy",
    name : "quuuux",
    some : "value"
}]

Это конвейер, который я написал:

[
    {
        $project : {
            names : 0,
            name: {
                $filter: {
                    input: '$names',
                    as: 'name',
                    cond: {
                        $switch: {
                            $branches: [
                                {
                                    case : {
                                        $eq : ["$$name.lang", "EN"]
                                    },
                                    then : "$$name.value"
                                } ,{
                                    case : {
                                        $eq : ["$$name.lang", "NOLANG"]
                                    },
                                    then : "$$name.value"
                                }
                            ],
                            default : ''
                        }
                    }
                }
            }
        }
    }
]

Это дает мне ошибку: ожидаемый "[" или AggregationStage, но "{" найден.

Что я делаю не так? Кто-нибудь может мне помочь, пожалуйста?

Спасибо

1 Ответ

1 голос
/ 08 июня 2019

Вы можете использовать ниже агрегации

db.collection.aggregate([
  { "$project": {
    "some": 1,
    "name": {
      "$arrayElemAt": [
        "$names.value",
        {
          "$cond": [
            {
              "$ne": [
                { "$indexOfArray": ["$names.lang", "EN"] },
                -1
              ]
            },
            { "$indexOfArray": ["$names.lang", "EN"] },
            { "$indexOfArray": ["$names.lang", "NOLANG"] }
          ]
        }
      ]
    }
  }}
])

Выход

[
  {
    "_id": "xxxxxx",
    "name": "baz",
    "some": "value"
  },
  {
    "_id": "yyyyyy",
    "name": "quuuux",
    "some": "value"
  }
]
...