$ ifNull, чтобы избежать добавления поля в агрегацию - PullRequest
0 голосов
/ 17 июня 2019

Я выполняю серию поисков, раскручиваний, addFields и проектов в моем запросе агрегации монго.

Структура моей базы данных следующая (сжатая): у меня есть две таблицы, A и B,и документы в A имеют поле otherID, которое либо содержит ноль / отсутствует, либо содержит ссылку на идентификатор документа в B.

Я выполняю поиск, чтобы объединить их вместе, добавив поле myFieldк возвращенным документам в A, содержащим документы в B. Кроме того, мне нужно переименовать поле (или, скорее, добавить одно поле и исключить другое) в присоединенном поддокументе, поэтому я сначала раскручиваю массив, возвращаемый объединением,выполнить addField, за которым следуют проект и группа, чтобы вернуть все обратно в форму массива.

Проблема в том, что во втором поиске / addField / etc, который я делаю, Mongo создает для меня поле, даже еслипервоначальный документ, на котором он должен быть, даже не существует.

сжатый, но более конкретный запрос (который на самом деле немного болееЭто сложный процесс, поскольку происходит два поиска):

{$lookup: {from: 'A', 
localField: 'otherID', foreignField:'_id', as:'myField'}}, 

{$unwind: {path: '$myField', preserveNullAndEmptyArrays: true}},

{$project: {
...other properties...
myField: {
id: '$myField._id',
...other properties...
}}},

{$lookup: {from: 'C', localField: 'myField.nextField', foreignField: '_id', as: 'myField.nextField'}},

{$unwind: {'path': '$myField.nextField', 'preserveNullAndEmptyArrays': true}},

{$addFields: {'myField.nextField.id': {$toString: '$myField.nextField._id'}}},

{$project: {'myField.nextField': {...exclusions...}}},

{ "$group": {
    "_id": "$_id",
    myField: {$push: '$myField'}
    ...inclusions...
}},

])

в принципе, не имеет значения, существует ли myField на самом деле, mongo установит для myField.nextField.id значение nullвместо того, чтобы вообще не включать nextField в массив myField.

Есть ли способ избежать этого?

Также есть способ избежать последнего списка включений в группе?Я буквально просто запихиваю объединенное поле обратно в массив, и мой документ огромен, поэтому мне сложно перечислить их все там.

...