我有这样的架构设计
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);
});
但结果会返回[]
。
答案 0 :(得分:1)
如果您只想获取aggregate
字段为isRead
的通知,则可以使用false
进行尝试。
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
,并发出一些通知{{ 1}}是假的。也可以使用isRead
$elemMatch
答案 1 :(得分:0)
我猜你的引用是错误的,因为查询是正确的。
确保您引用的是您导出的内容。
示例:
如果您在架构代码中引用notifications
,那么您应该在代码中导出相同的名称。
module.exports = mongoose.model("notifications", userNotificationSchema);
请看这里https://alexanderzeitler.com/articles/mongoose-referencing-schema-in-properties-and-arrays/