Данные исключаются при использовании $unwind в представлении MongoDB
В моем бэкэнде MongoDB я определил вид Mongo, который возвращает список сотрудников. Проблема, с которой я сталкиваюсь, состоит в том, если я использую $lookup
с последующим $unwind
на одном из моих этапов агрегирования, и у этого конкретного человека еще нет данных для этого свойства, тогда они будут исключены из возвращенных данных. Я говорю об агрегации так:
{
$lookup: { "from" : "departments", "localField" : "department", "foreignField" : "_id", "as" : "department" }
},
{
$unwind: { "path" : "$department" }
},
Есть ли способ обойти это: где я могу использовать $lookup
а также $unwind
здесь, а также НЕ исключая этого человека, если у него нет данных для этого поля? И будет ли это сделано здесь или в $project
Этап я называю пару этапов позже (см. код ниже)?
{
$project: { "name" : 1.0, "department" : { "name" : "$department.name" }, "branch" : { "name" : "$branch.name" }, "addresses" : 1.0, "notes" : 1.0, "phones" : 1.0, "emails" : 1.0, "updatedAt" : 1.0 }
},
2 ответа
Вы можете использовать preserveNullAndEmptyArrays
из $unwind
для достижения этой цели:
{
$lookup: {
"from" : "departments",
"localField" : "department",
"foreignField" : "_id",
"as" : "department" }
},
{
$unwind: {
"path" : "$department",
"preserveNullAndEmptyArrays": true
}
},
Согласно документации MongoDB
If you specify a path for a field that does not exist in an input document or the field
is an empty array, $unwind, by default, ignores the input document
and will not output documents for that input document.
New in version 3.2: To output documents where the array field is missing,
null or an empty array, use the option preserveNullAndEmptyArrays.
Вы можете попробовать выполнить следующий совокупный запрос
db.collection.aggregate([
{
$lookup: {
"from" : "departments",
"localField" : "department",
"foreignField" : "_id",
"as" : "department" }
},
{
$unwind: {
"path" : "$department",
"preserveNullAndEmptyArrays": true
}
}])