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

версия mongoose 4.6.1 –

+0

запрос выглядит правильно, является ли userid правильным для _id? –

ответ

0

Я думаю, что ваша ссылка неверна, потому что запрос правильный.

Убедитесь, что вы имеете в виду, что вы экспортируете.

Пример:

Если вы имеете в виду notifications в коде схемы, то вы должны экспортировать такое же имя в коде.

module.exports = mongoose.model("notifications", userNotificationSchema); 

Взгляните здесь https://alexanderzeitler.com/articles/mongoose-referencing-schema-in-properties-and-arrays/

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

Я не понимаю, почему отрицательный и вы можете мне сказать? –