通过基于嵌套和子嵌套文档的过滤器选择一个字段,例如使用 mongo 的后>评论>喜欢


{
"_id" : ObjectId("5da7c114753c6202f4f4d3b2"),
"image" : "hem sopheap-1571275028119.jpg",
"body" : "my first postrnyes this my post",
"date" : ISODate("2019-10-17T00:59:18.901Z"),
"comments" : [ 
{
"user" : "5d999578aeb073247de4bd6e",
"fullname" : "hem sopheap",
"username" : "sopheap",
"comment" : "My first comment",
"_id" : ObjectId("5da7c125753c6202f4f4d3b4"),
"replies" : []
}, 
{
"user" : "5da85558886aee13e4e7f044",
"fullname" : "soeng kanel",
"username" : "",
"comment" : "Mr. kansael comment",
"_id" : ObjectId("5da8557f886aee13e4e7f045"),
"replies" : [],
"date" : ISODate("2019-10-17T10:10:37.394Z"),
"likes" : [ 
"5d999578aeb073247de4bd6e", 
"5d999578aeb073247de4bd6f"
]
}
],
"__v" : 41,
"likes" : [ 
"5d999578aeb073247de4bd6e", 
"5d999578aeb073247de4bd6p"
]
}

我想获得特定comments的所有likes,而不是post在 SQL 语句中类似这样的东西:

db.posts.find({
"comments": {
$elemMatch: {
"_id": ObjectId("5da8557f886aee13e4e7f045")
}
}
}, {
likes:"$comments", _id:0
}).pretty()

预期的结果应该是这样的

"likes" : [ "5d999578aeb073247de4bd6e", "5d999578aeb073247de4bd6f" ]

阅读关于$elemMatch

这是为您提供的完整查询

db.posts.find({
"comments": {
$elemMatch: {
"user": "5da85558886aee13e4e7f044",
"_id": ObjectId("5da8557f886aee13e4e7f045")
}
}
}, {
likes:"$comments.likes", _id:0
}).pretty()

解释:

人们在基于数组子文档的多个字段进行过滤时犯的一个常见错误是简单地执行类似{"comments._id": "something", "comments.user": "something"}的操作,它返回数组子文档的所有项目,只要某些项目与 id、user 匹配。这个问题的解决方案是$elemMatch

最新更新