Sun*_*Lee 11 lookup mongodb aggregation-framework
标题说明了一切.如果文档根据其匹配字段不会导致任何匹配的外部文档,那么为什么它不包含在管道的结果集中呢?
我正在测试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()
Run Code Online (Sandbox Code Playgroud)
因此,如果我有一个user空profile.universities数组,那么无论$lookup返回任何匹配项,我都需要将它包含在结果集中,但事实并非如此.我怎么能这样做,以及Mongo构建$lookup这种方式的原因是什么?
Joh*_*yHK 31
此行为与此无关$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()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9799 次 |
| 最近记录: |