MongoDB:使用嵌套数组过滤的find和findOne [英] MongoDB: find and findOne with nested array filtering
问题描述
这个小任务比我想象的要难.
This little task turned out to be harder than I thought.
考虑以下非常简单的帖子集合.假设我要显示所有帖子,并仅显示未删除的评论.
Consider the following very simple Posts collection. Suppose I want to display all the posts, coupled with only the comments that were not deleted.
I.E.从评论数组中过滤出已删除的评论.
I.E. filter out the deleted comments from the comments array.
由于每个帖子中有100条已删除的评论,有没有办法在服务器端执行此操作?
Since I have 100s of deleted comments per post, is there a way to do this server side?
集合:
{
"author": {},
"message": "This is post1",
"comments": [
{
"message": "Im number 1!!!",
"state": {
"deleted": false
}
},
{
"message": "YOU MOTHERF****R",
"state": {
"deleted": true
}
},
{
"message": "tHIS IS GREAT!",
"state": {
"deleted": false
}
},
{
"message": "I can type better than you guys",
"state": {
"deleted": false
}
}
]
},
{
"author": {},
"message": "This is post 2",
"comments": [
{
"message": "This is bulls**t",
"state": {
"deleted": true
}
},
{
"message": "YOU MOTHERF****R",
"state": {
"deleted": true
}
},
{
"message": "I hate u!",
"state": {
"deleted": true
}
},
{
"message": "I wanna have your children",
"state": {
"deleted": false
}
}
]
}
推荐答案
我会 TL; DR ,因为事实证明这真是太难了.我已经尝试过$elemMatch
,我已经尝试过$redact
(也具有$$ CURRENT和$$ ROOT),我已经尝试过$map
,我已经尝试了聚合框架,我已经尝试了$project
.
I'll TL;DR since this turned out to be a hell of a ride. I've tried $elemMatch
, I've tried $redact
(also with $$CURRENT and $$ROOT), I've tried $map
, I've tried the aggregation framework, I've tried $project
.
您可以在此处阅读全部内容: https://www.devsbedevin.net/mongodb-find-findone-with-nested-array-filtering-finally/
You can read all about it here: https://www.devsbedevin.net/mongodb-find-findone-with-nested-array-filtering-finally/
解决方案似乎是使用聚合框架来过滤数组,并用结果覆盖comments属性.这比听起来简单:
The solution seems to be to use the aggregation framework to filter the array and override the comments property with the results. This is simpler than it sounds:
db.getCollection('posts').aggregate(
{$match: {"author.id": authorId}},
{$addFields : {"comments":{$filter:{ // We override the existing field!
input: "$comments",
as: "comment",
cond: {$eq: ["$$comment.state.deleted", false]}
}}}}
);
结果:
{
"author": {},
"message": "This is post1",
"comments": [
{
"message": "Im number 1!!!",
"state": {
"deleted": false
}
},
{
"message": "tHIS IS GREAT!",
"state": {
"deleted": false
}
},
{
"message": "I can type better than you guys",
"state": {
"deleted": false
}
}
]
},
{
"author": {},
"message": "This is post 2",
"comments": [
{
"message": "I wanna have your children",
"state": {
"deleted": false
}
}
]
}
这篇关于MongoDB:使用嵌套数组过滤的find和findOne的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!