我有一个集合
posts
,其中有一个对象数组comments
。在这个对象数组中,我有另一个对象数组likes
。
我正在尝试编写一个查询,从帖子中提取最近 5 条评论,并且根据用户是否已经喜欢该评论,仅提取
true
或 false
的 likes
。
到目前为止我已经写了:
db.posts.aggregate([
{
"$match": {
"_id": postId
}
},
{
"$project":
{
"comments": {
"$slice": [ "$comments", -5 ]
}
}
},
{
"$project": {
"comments.content": 1,
"comments.likes": {
"$eq": [ "comments.likes.$.createdBy.username", username ]
}
}
}
])
但这似乎每次都会拉
false
。
是否可以做到这一点而无需编写单独的查询来检查用户是否喜欢?
与
username = "testusername"
和 postId = "60fcd335abbe5a73583b69f0"
我期望输出:
[
{
"content": "test comment",
"likes": true
},
{
"content": "another test comment",
"likes": true
}
]
和
username = "testusername2"
我期望输出
[
{
"content": "test comment",
"likes": true
},
{
"content": "another test comment",
"likes": false
}
]
感谢@ray 在这方面的帮助。 这里是压缩代码,请参阅 ray 对代码拆分的响应以及解释。
您可以使用
$map
逐层处理数组。
$map
评论来投射一个布尔值,表示用户1是否喜欢这些赞$anyElementTrue
对投影布尔值进行检查db.posts.aggregate([
{
"$match": {
"_id": "p1"
}
},
{
"$project": {
"comments": {
"$slice": [
"$comments",
-5
]
}
}
},
{
"$project": {
likes: {
"$map": {
"input": "$comments",
"as": "c",
"in": {
content: "$$c.content",
likedByU1: {
"$map": {
"input": "$$c.likes",
"as": "l",
"in": {
$eq: [
"$$l.createdBy._id",
"u1"
]
}
}
}
}
}
}
}
},
{
"$project": {
likes: {
"$map": {
"input": "$likes",
"as": "l",
"in": {
content: "$$l.content",
likedByU1: {
"$anyElementTrue": [
"$$l.likedByU1"
]
}
}
}
}
}
}
])
这里是 Mongo Playground 来展示这个想法(对你的示例进行一些小的修改)。您可以修改它以满足您的需要。