标题说明了一切。如果一个文档没有根据其匹配字段生成任何匹配的外部文档,那又怎么不将其包含在管道的结果集中呢?
我正在测试Mongo 3.2中的新聚合器,并且通过首先展开,然后将文档重新分组来执行嵌套数组查找。我剩下的就是要让结果包括所有不符合$lookup
条件的本地文档,这就是我认为的“左外部联接”的标准定义。
这是查询:
db.users.aggregate([
{
$unwind: "$profile",
$unwind: "$profile.universities"
},
{
$lookup: {
from: "universities",
localField: "profile.universities._id",
foreignField: "_id",
as: "profile.universities"
}
},
{
$group: {
_id: "$_id",
universities: {
$addToSet: "$profile.universities"
}
}
}
]).pretty()
因此,如果我有一个user
具有空profile.universities
数组的数组,那么无论$lookup
返回什么匹配项,我都需要将其包含在结果集中,但事实并非如此。我该怎么做,以及Mongo为何$lookup
采用这种方式运作?
此行为与无关$lookup
,这是因为的默认行为$unwind
是忽略缺少引用字段或空数组的文档。
要保留展开的文档(即使profile.universities
是空数组),也可以将其preserveNullAndEmptyArrays
选项设置为true
:
db.users.aggregate([
{
$unwind: "$profile",
$unwind: {
path: "$profile.universities",
preserveNullAndEmptyArrays: true
}
},
{
$lookup: {
from: "universities",
localField: "profile.universities._id",
foreignField: "_id",
as: "profile.universities"
}
},
{
$group: {
_id: "$_id",
universities: {
$addToSet: "$profile.universities"
}
}
}
]).pretty()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句