Запрос Mongodb, выравнивание объектов с помощью массива - PullRequest
1 голос
/ 09 мая 2019

Документ:

{
   objectId: 35,
   properties: [
     {
       pset: 'A1',
       property: 'Fire',
       value: '60'
     },
     {
       pset: 'B1',
       property: 'Fire',
       value: '70'
     }  
   ]
}

Входные данные для запроса:

{ 
   psetsWithProperties: [{ pset: 'A1', property: 'Fire'}, { pset: 'abc', property: 'fff'}]
}

Сочетание pset и свойства всегда уникально.Таким образом, в коллекции свойств не может быть двух 'A1' и 'Fire'.

Ожидаемый результат:

[{
  objectId: 35,
  properties: {
    'A1/Fire': '60'
  }
}]

Таким образом, второй элемент (B1, Fire) не включен, так какне на входе.

Если совпадений нет вообще, объект свойств будет пустым:

[{
  objectId: 35,
  properties: {}
}]

Здесь следует использовать структуру агрегации MongoDB.

Что-то с $in, $group, $unwind IПодумайте.

Не знаю, с чего начать.

Не должно быть точно, как в моих примерах.

Есть идеи?

1 Ответ

1 голос
/ 09 мая 2019

Чтобы сопоставить массив с другим массивом, вы можете использовать $ filter с $ anyElementTrue и $ map .Затем для динамического генерирования значений ключей JSON вам понадобится оператор $ arrayToObject , попробуйте:

db.col.aggregate([
    {
        $project: {
            _id: 0,
            objectId: 1,
            data: {
                $filter: {
                    input: "$properties",
                    as: "docProp",
                    cond: {
                        $anyElementTrue: {
                            $map: {
                                input: [{ pset: 'A1', property: 'Fire'}, { pset: 'abc', property: 'fff'}],
                                as: "paramProp",
                                in: {
                                    $and: [
                                        { $eq: [ "$$docProp.pset", "$$paramProp.pset" ] },
                                        { $eq: [ "$$docProp.property", "$$paramProp.property" ] },
                                    ]
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    {
        $project: {
            objectId: 1,
            properties: {
                $arrayToObject: {
                    $map: {
                        input: "$data",
                        in: {
                            k: { $concat: [ "$$this.pset", "/", "$$this.property" ] },
                            v: "$$this.value"
                        }
                    }
                }
            }
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...