MongoDB 嵌套聚合(连接)
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"
}
}
]
)
EDIT-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
中准确获取用户信息吗?我需要 return 这样的结果:
{
"_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}
},
]
);
在 运行 上面的查询之后 return 下面的字段和其他内容字段没有显示:
{
"_id" : ObjectId("5a6b8b734f1408137f79e2cc"),
"reviews" : [
{
"likeUsers" : [
{
"username" : "e.farahani",
"firstname" : "Ehsan",
"lastname" : "Farahani Asil"
}
]
}
]
}
我有一个文档想要运行嵌套聚合,但我不知道如何运行这个操作。
内容文档(删除了不必要的字段):
{
"_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"
}
}
]
)
EDIT-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
中准确获取用户信息吗?我需要 return 这样的结果:
{
"_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}
},
]
);
在 运行 上面的查询之后 return 下面的字段和其他内容字段没有显示:
{
"_id" : ObjectId("5a6b8b734f1408137f79e2cc"),
"reviews" : [
{
"likeUsers" : [
{
"username" : "e.farahani",
"firstname" : "Ehsan",
"lastname" : "Farahani Asil"
}
]
}
]
}