gpt4 book ai didi

node.js - Mongoose 查询内部文档数组

转载 作者:可可西里 更新时间:2023-11-01 10:41:48 24 4
gpt4 key购买 nike

我有这样的模式设计

var userNotificationSchema = new Schema({
notification_id: { type: Schema.Types.ObjectId, ref: 'notifications' },
isRead: { type: Boolean }
});

var userSchema = new Schema({
notification: [userNotificationSchema]
});

我想获取所有 isRead: 'false' 的通知数组列表。

为此我写了

Model.User.find({
_id: userid,
'notification.isRead': false
}, function (err, result) {
console.log(result);
res.send(result);
});

但这会返回 [] 作为结果。

最佳答案

如果您只想获取那些 isRead 字段为 false 的通知,您可以尝试使用 aggregate

Model.User.aggregate([
{$match:{_id: userid}},
{$unwind:"$notification"},
{$match:{"notification.isRead": false}},
{$group:{_id:"$_id",notification:{ $addToSet: "$notification"}}}
]).exec(function (err, result) {
console.log(result);
res.send(result);
})

例如您的文档如下:

{
"_id" : ObjectId("58454926668bde730a460e15"),
"notification" : [
{
"notification_id" : ObjectId("58454926668bde730a460e16"),
"isRead" : true
},
{
"notification_id" : ObjectId("58454926668bde730a460e17"),
"isRead" : true
},
{
"notification_id" : ObjectId("58454926668bde730a460e19"),
"isRead" : false
}
]
}

然后输出会是这样的:

{
"_id" : ObjectId("58454926668bde730a460e15"),
"notification" : [
{
"notification_id" : ObjectId("58454926668bde730a460e19"),
"isReady" : false
}
]
}

如果您希望在 isRead 中的任何一个为 false 时获得所有通知,那么您的查询是正确的,只需检查 userid 是否存在于您传递的数据库和一些通知 isRead 是 false 。也可以使用 $elemMatch

Model.User.find({
_id: userid
"notification":{ $elemMatch: { "isRead": false} }
}).exec(function (err, result) {
console.log(result);
res.send(result);
})

关于node.js - Mongoose 查询内部文档数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41439971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com