标题说明了一切.如果文档根据其匹配字段不会导致任何匹配的外部文档,那么为什么它不包含在管道的结果集中呢?
我正在测试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这种方式的原因是什么?
MongoDB聚合按分钟呈指数级复杂化!
我在迄今为$unwind嵌套数组,然后执行$lookup由_id每一个对象的从unwinded嵌套数组.我的最后一次尝试是逆转放松$group.但是,我无法使用其原始属性名称以及每个文档的其余原始直接属性重建原始嵌入数组.
这是我到目前为止的尝试:
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",
emails: { "$first": "$emails" },
profile: { "$first": "$profile" },
universities: { "$push": "$profile.universities" }
}
}
]).pretty()
Run Code Online (Sandbox Code Playgroud)
我得到的是这样的:
{
"_id" : "A_USER_ID",
"emails" : [
{
"address" : "AN_EMAIL_ADDRESS",
"verified" : false
}
],
"profile" : {
"name" …Run Code Online (Sandbox Code Playgroud) join mongodb mongodb-query aggregation-framework mongodb-aggregation