mongoose查询内部文档数组

时间:2017-01-03 09:11:58

标签: node.js mongodb mongoose mongodb-query aggregation-framework

我有这样的架构设计

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

但结果会返回[]

2 个答案:

答案 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/