Tôi sẽ TL; DR vì điều này hóa ra là một chuyến đi địa ngục. Tôi đã thử $elemMatch
, Tôi đã thử $redact
(cũng với $$ CURRENT và $$ ROOT), tôi đã thử $map
, Tôi đã thử khung tổng hợp, tôi đã thử $project
.
Bạn có thể đọc tất cả về nó tại đây:https://www.devsbedevin.net/mongodb-find-findone-with-nested-array-filtering-finally/
TL; DR
Giải pháp dường như là sử dụng khung tổng hợp để lọc mảng và ghi đè thuộc tính nhận xét với kết quả. Điều này đơn giản hơn âm thanh:
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]}
}}}}
);
Kết quả:
{
"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
}
}
]
}