2

我有一個架構設計這樣貓鼬查詢內部文件陣列

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

什麼是你的貓鼬版本在應用程序中使用? –

+0

貓鼬版本4.6.1 –

+0

查詢看起來正確,用戶ID是否正確_id? –

回答

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是否存在於您通過的數據庫中,並且某些通知isRead爲假。也可以使用$elemMatch

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

我不明白爲什麼消極,你能告訴我嗎? –