2016-07-12 3 views
0

У меня есть документ, который выглядит немного как это:Найти элемент массива, который может или не может существовать

> db.orders.find() 
{ 
    _id: ObjectId(), 
    _reminders: [{ 
    notified: true, 
    timestamp: ISODate(), 
    completed: false 
    }] 
} 
{ 
    _id: ObjectId(), 
    _reminders: [] 
} 

То, что я пытаюсь найти это документ, в сборе заказов, где «напоминание» не содержит напоминание в определенном временном диапазоне и не завершено.

db.orders.find({ 
    '_reminders': { 
    $elemMatch: { 
     completed: false, 
     timestamp: { $ne: time } 
    } 
    } 
}); 

Проблема в том, что это не нашло порядка, у которого нет никаких напоминаний.

Как бы запросить это?

ответ

2

Это должно получить, что вы хотите

db.getCollection('Clock').find({ 
$or : [ 
    { 
     _reminders : { 
       $elemMatch : { 
        timestamp : { 
         $lte : ISODate("2019-07-12T15:35:32.278Z"), 
         $gte : ISODate("2012-07-12T15:35:32.278Z") 
         }, 
        completed : false 
       } 
     } 
    }, 
    { 
     _reminders : {$size : 0}  
    }, 
    { 
     _reminders : {$exists : false} 
    } 
] 

})

2

Вы должны использовать запрос $or.

db.orders.find({$or: [ { _reminders: [] }, here_put_your_query_with_time_match ]}) - он возвращает оба документа, которые соответствуют вашему запросу и они с пустым _reminders