2013-05-09 3 views
0

Попытка запроса коллекции mongo для документов, которые являются подмножествами моего объекта (запроса). , например.Сбор запросов для подмножеств

object: 
{ 
    "animal": "cat" 
    ,"owner": "mike" 
    ,"color": "blue" 
    ,"city": "houston" 
} 

collection: 
[ 
    [0]{ 
     "color": "red" 
     ,"animal": "cat" 
    } 
    [1]{ 
     "color": "blue" 
    } 
    [2]{ 
     "owner": "mike" 
     ,"city": "houston" 
    } 
] 

result: 
    [1]{ 
     "color": "blue" 
    } 
    [2]{ 
     "owner": "mike" 
     ,"city": "houston" 
    } 
+0

что это объект представляет? возможные атрибуты в коллекции? – sambomartin

+0

Объектом может быть любой объект json. Я хочу найти любые документы в коллекции, которые являются подмножествами объекта. – ngourley

ответ

0

Вам нужно будет построить запрос динамически, основываясь на свойствах объекта JavaScript.

Запрос было бы что-то вроде:

$and : [ 
    {$or : [{ color: { $exists: true, $eq: 'blue' } }, {color: { $exists:false} }]}, 
    {$or : [{ owner: { $exists: true, $eq: 'mike' } }, {owner: { $exists:false} }]}, 
    ... 
    // iterate through the other properties. 
] 

EDIT:

Используя $and средство, которое документы в коллекции имеют свойство все они должны совпадать с object - вы могли бы изменить к $or, чтобы соответствовать любому из атрибутов.

EDIT 2

Также стоит учесть производительность будет беден для больших коллекций, если не использовать индексированные атрибуты в запросе. Одним из решений вашей проблемы будет использование массива и мультикидный индекс.

т.е.

{ tags : [ "color=blue","owner=mike" ] } 

таким образом, вы можете использовать регулярные выражения \^color=\ вернуть все документы с классом = тега и использовать индекс. Вы также можете сделать \^color = blue \ для блюза.

Затем, чтобы выполнить несколько условий, вы должны использовать операторы $all или $in.

E.g.

{ tags : { $in: [/^color=blue/, /^owner=mike/]} } 

Надежда, что помогает

+0

Я пробовал эту последнюю ночь. Проблема заключается в том, что использование этого шаблона заключается в том, что объект, имеющий свойства, которых нет в документе, все равно будет иметь этот документ в наборе результатов, потому что мы принимаем документы, где полей не существует. '$ и: [ {$ или: [{цвет: {$ существует: правда, $ экв: 'голубой'}}, {цвет: {$ существует: ложный}}]} ]' Это будет оттяните все документы. – ngourley

+0

Это правда, вы считали мою альтернативную идею? – sambomartin

+0

Единственный способ использования этого шаблона - построить перестановки различных комбинаций условий. Это был бы гораздо больший запрос, но он все равно генерировался динамически. – sambomartin

Смежные вопросы