MongoDB 聚合每分钟都变得指数级复杂!
我目前是$unwind
一个嵌套数组,然后对展开的嵌套数组中的每个对象执行$lookup
一个_id
。我最后的尝试是用$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()
我得到的是这样的:
{
"_id" : "A_USER_ID",
"emails" : [
{
"address" : "AN_EMAIL_ADDRESS",
"verified" : false
}
],
"profile" : {
"name" : "NAME",
"company" : "A COMPANY",
"title" : "A TITLE",
"phone" : "123-123-1234",
"disabled" : false,
"universities" : [
{
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : {AN_OBJECT}
}
]
},
"universities" : [
[
{
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : {AN_OBJECT}
}
],
[
{
"_id" : "ID_2",
"name" : "UNIVERSITY_NAME_2",
"code" : "CODE_2",
"styles" : {AN_OBJECT}
}
]
]
}
这个结果有两个问题:
- 结果
universities
是一个数组的数组,每个数组都有一个对象,因为返回的是原始嵌套数组$lookup
的单个元素数组。$profile.universities
它应该只是一个对象数组。 - 结果
universities
应取其原始位置,如嵌套在profiles
. 我知道为什么原来profile.universities
是这样的,因为我正在使用$first
运算符。我的意图是保留 的所有原始属性profile
,同时保留原始嵌套universities
数组。
最终,我需要的是这样的:
{
"_id" : "A_USER_ID",
"emails" : [
{
"address" : "AN_EMAIL_ADDRESS",
"verified" : false
}
],
"profile" : {
"name" : "NAME",
"company" : "A COMPANY",
"title" : "A TITLE",
"phone" : "123-123-1234",
"disabled" : false,
"universities" : [
{
"_id" : "ID_1",
"name" : "UNIVERSITY_NAME_1",
"code" : "CODE_1",
"styles" : {AN_OBJECT}
},
{
"_id" : "ID_2",
"name" : "UNIVERSITY_NAME_2",
"code" : "CODE_2",
"styles" : {AN_OBJECT}
}
]
}
}
我可以使用另一个运算符来代替$group
实现此目的吗?还是我理解$group
错误的目的?
编辑:这是原始帖子,上下文: 如果 Mongo $lookup 是左外连接,那么它怎么会排除不匹配的文档?