Мы ищем способ сортировки документов по значению, которое находится в массиве внутри документа.Особенность заключается в том, что мы хотим отсортировать только по значению, когда другое свойство имеет определенное значение.
Вот так выглядят наши документы:
{
_id: '1',
elements: [
{
key: 'locationName',
value: 'A value'
},
{
key: 'address',
value: 'Somewhere over the rainbow'
},
],
},
{
_id: '2',
elements: [
{
key: 'address',
value: 'Far far away'
},
{
key: 'locationName',
value: 'Another value'
},
],
},
{
_id: '3',
elements: [],
}
В этом случае мы хотимотсортировать документы по значению имени местоположения, которое находится в elements.$.key === 'locationName'
.
После игры с $unwind
и $match
мы смогли отсортировать документы - но с размоткой массива и сопоставлением по key === 'locationName'
последний документ в примере будет «удален», так как для этого документа не найдено совпадений.Но, конечно, мы хотим также перечислить документы, в которых не указано locationName.Другая проблема заключалась в том, что, когда мы использовали $unwind
, другие значения внутри массива элементов будут удалены, если в качестве ключа не указано locationName, поэтому key: address
будет удален, а возвращенные документы будут иметь объект вместо массива.который выглядит так:
{
_id: '1',
elements: {
key: 'locationName',
value: 'A value'
},
},
{
_id: '2',
elements: {
key: 'locationName',
value: 'Another value'
},
}
Итак, наша идея состояла в том, чтобы создать новое поле в агрегации, которое содержит locationName
.Мы знаем, что есть операция $addFields
, но в нашем случае наша версия mongodb слишком мала (мы используем 3.2), поэтому мы хотели бы найти решение без $addFields
.
Мы не уверены, чтоэто возможно, что мы хотим сделать, или если это невозможно с нашей текущей версией mongoDB.Может быть, у одного из вас есть идея, как решить эту проблему?