#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',
}
}])