我有一个这样的模式设计
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);
});
但结果会返回
[]
。 最佳答案
如果您只想获得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
则您的查询是正确的,只需检查通过的db中是否存在userid
并且某些通知是错误的。也可以使用isRead
Model.User.find({
_id: userid
"notification":{ $elemMatch: { "isRead": false} }
}).exec(function (err, result) {
console.log(result);
res.send(result);
})