[英]MongoDB nested aggregation (join)
我有一个文档想要对此进行嵌套聚合,但是我不知道如何运行此操作。
内容文档(已删除不必要的字段):
{
"_id" : ObjectId("5a6b8b734f1408137f79e2cc"),
"reviews" : [
{
"_id" : ObjectId("5a6cf7c41562160494238781"),
"headline" : "",
"body" : "",
"likeUsers" : [
{
"_id" : ObjectId("5a6b5f2e1fc2a11c5c83a6e2")
}
],
"dislikeUsers" : [],
"isCritic" : false,
"isSpoilers" : false,
"isTop" : true,
"rate" : 3,
"userId" : ObjectId("5a6b5f2e1fc2a11c5c83a6e2"),
"date" : Timestamp(1517090823, 1)
}
]
}
用户内容:
{
"_id" : ObjectId("5a6b5f2e1fc2a11c5c83a6e2"),
"username" : "",
"password" : "",
"firstname" : "",
"lastname" : "",
"email" : "",
"mobile" : "",
"tel" : "",
"nationalCode" : "",
"gender" : "male",
"birthdate" : Timestamp(0, 1),
"promotionCode" : "12131SKSQ",
"status" : 1,
"created" : Timestamp(1516986633, 1),
"updated" : Timestamp(1516986633, 2)
}
我想从likeUsers
数组字段获取所有用户信息。
您可以使用$lookup
聚合将喜欢的用户的信息作为嵌入式数组获取
db.content.aggregate(
[
{$match : {"_id" : ObjectId("5a6b8b734f1408137f79e2cc")}},
{
$lookup : {
from : "user",
localField : "reviews.likeUsers._id",
foreignField : "_id",
as : "likeUsersInfo"
}
}
]
)
编辑1
在相同的层次结构中嵌入文档
db.content.aggregate(
[
{$match : {"_id" : ObjectId("5a6b8b734f1408137f79e2cc")}},
{
$lookup : {
from : "user",
localField : "reviews.likeUsers._id",
foreignField : "_id",
as : "likeUsersInfo"
}
},
{$addFields : {"reviews.likeUsers" : "$likeUsersInfo"}},
{$project : {likeUsersInfo : 0}}
]
).pretty()
非常感谢您的回复。 是否有可能在reviews.likerUsers
准确获取用户信息? 我需要这样的返回结果:
{
"_id" : ObjectId("5a6b8b734f1408137f79e2cc"),
"reviews" : [
{
"_id" : ObjectId("5a6cf7c41562160494238781"),
"headline" : "",
"body" : "",
"likeUsers" : [
{
"_id" : ObjectId("5a6b5f2e1fc2a11c5c83a6e2"),
"username" : "",
"firstname" : "",
"lastname" : ""
}
],
"dislikeUsers" : [],
"isCritic" : false,
"isSpoilers" : false,
"isTop" : true,
"rate" : 3,
"userId" : ObjectId("5a6b5f2e1fc2a11c5c83a6e2"),
"date" : Timestamp(1517090823, 1)
}
]
}
最后,我可以使用$addFields
和$project
命令在确切的标签中获取用户信息。 我为有限的用户信息字段添加了另一个$project
。 操作成功运行并且reviews.likeUsers。[users]字段受到限制,但内容字段未显示。
新查询:
db.contents.aggregate(
// Pipeline
[
// Stage 1
{
$lookup: // Equality Match
{
from : "users",
localField : "reviews.likeUsers._id",
foreignField : "_id",
as : "likeUsersInfo"
}
},
// Stage 2
{
$addFields: {"reviews.likeUsers" : "$likeUsersInfo"}
},
// Stage 3
{
$project: {likeUsersInfo : 0}
},
// Stage 4
{
$project: {"reviews.likeUsers.username": 1,"reviews.likeUsers.firstname": 1,"reviews.likeUsers.lastname": 1}
},
]
);
在以上查询中运行后,返回以下字段,其他内容字段不显示:
{
"_id" : ObjectId("5a6b8b734f1408137f79e2cc"),
"reviews" : [
{
"likeUsers" : [
{
"username" : "e.farahani",
"firstname" : "Ehsan",
"lastname" : "Farahani Asil"
}
]
}
]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.