我有一个这样的模式设计

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);
})

10-04 21:30