Поскольку вы спроектировали данные, это невозможно.
В MongoDB запросы возвращают весь документ.Вы можете фильтровать определенные поля, но если значение поля является массивом, оно на этом останавливается.
Когда у вас есть «массивы объектов», вам нужно либо $slice
, что не то, что вам нужно, или вам нужно смоделировать ваши данные по-другому.
В вашем случаеследующая структура сделает ваш запрос возможным:
{
_id: 1234,
type: 'a',
subs: {
'123001': { val: 'a' },
'123002': { val: 'b' },
'123003': { val: 'c' }
}
}
Обратите внимание, как я изменил subs
в объект JSON вместо массива.Теперь вы можете выполнить следующий запрос и получить только то время, которое вам нужно:
find( { _id: 1234 }, { 'subs.123002': 1 } )
Очевидный компромисс здесь заключается в том, что вам придется изменить способ использования документа - изменить.Вы не можете использовать $push
на subs
, вы не можете запрашивать {'subs.time': 1234}
, вместо этого вы должны запросить {'subs.1234': { $exists:true} }
.