Мангуст игнорирует пустые поля при агрегировании

#javascript #node.js #mongodb #mongoose #nosql

Вопрос:

коллекция: A

Документ:

 {
color: '',
age: 22,
name: 'John'
}
 

Коллекция: B

Документ:

 {
name:'John',
marks: 100
}
 

Я выполняю агрегат, объединяя обе коллекции примерно так

 A.aggregate([
    {
      $match: filters
    },
    {
      $lookup: {
        from: 'B',
        localField: 'name',
        foreignField: 'name',
        as: 'alias1',
      }
    },
    {
      $unwind: '$alias1'
    },
    {
      $project: {
        color: '$color',
        marks: '$alias1.marks',
       }
}])
 

Результат, который я получаю, таков:

 {
marks:100
}
 

Результат, которого я ожидаю, таков:

 {
color: '',
marks: 100
}
 

Я предполагаю , что, поскольку цветовое поле пусто, агрегат по умолчанию игнорирует его.

В принципе, я хочу объединить две таблицы и получить данные для нескольких полей. Если aggregate не решит эту проблему, то любой другой способ достижения желаемого результата будет очень полезен. Спасибо.

Комментарии:

1. Работает ли агрегация с непустыми color полями?

2. @WernfriedDomscheit, но разве alias1 не является своего рода ссылкой на поля коллекции B ?

3. Ваш образец работает так, как ожидалось, см. mongoplayground.net/p/bd-F3iMADfP

4. ваш запрос дает результат, который вам нужно увидеть , но для этого он предполагает, что поиск с максимальным значением 1 из коллекции B, в противном случае вам нужно $group будет пройти этапы один за другим, чтобы увидеть, что происходит.

Ответ №1:

Попробуйте выполнить следующий запрос :

 A.aggregate([
    {
      $match: filters
    },
    {
      $lookup: {
        from: 'B',
        localField: 'name',
        foreignField: 'name',
        as: 'alias1',
      }
    },
    {
      $unwind: '$alias1'
    },
    {
      $project: {
        color: { $ifNull: [ "$color", "" ] },
        marks: '$alias1.marks',
       }
}])