Запрос MongoDB для получения одного значения массива по значению в массиве - PullRequest
6 голосов
/ 02 июля 2011

У меня есть коллекция документов, каждый из которых содержит массив вложенных документов.Каждый поддокумент имеет значение времени.Я пытаюсь выяснить, могу ли я вернуть вложенный документ, основываясь на времени в вложенном документе.

Я знаю, что могу получить вложенный документ, используя $ slice, но $ slice дает мне только определенный индекс или диапазон и смещение.

Пример времени!

Документы похожи на такие ....

{ 
    id: 1234, 
    type: 'a', 
    subs: [
        { time: 123001, val: 'a' },
        { time: 123002, val: 'b' },
        { time: 123003, val: 'c' }
    ]
}

Если я сделаю запрос с помощью find ({}, {subs: {$ slice:[2,1]}}) Я получаю что-то вроде:

{ id: 1234, type: 'a', subs: [{ time: 123002, val: 'b' }]}

Я хочу получить эту запись, например, не на основе смещения, а на основе значения времени 123002.

Возможно?

иди!

1 Ответ

4 голосов
/ 02 июля 2011

Поскольку вы спроектировали данные, это невозможно.

В 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} }.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...