2015-04-23 1 views
1

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

Условие $ AND работает как ожидалось, но когда я добавляю $ OR, результаты не изменяются. Любая помощь приветствуется.

Collection.find({ 
    $and:[ 
     {lat: { $ne:""}}, 
     {lon: { $ne:""}}, 
     {type : "foo"},    
     {keywords:{ $regex : "bar", $options:"i" }}, 
     { $or:[ 
     {isOpen : "True"}, 
     {isOpen : "False"},    
     {price : { $gte: 0}}, 
     ] 
     }, 
    ] 
    } 
) 
+0

Вам действительно не нужно использовать '$ и 'здесь, но в противном случае это выглядит нормально. Можете ли вы обновить свой вопрос, чтобы включить примерный документ, который либо не возвращается, либо исключен, как ожидалось? – JohnnyHK

ответ

1

Просто создайте запрос, в котором вы указываете только список выражений с разделителями-запятыми, поскольку он неявно выполняет операцию И для вас. Вы можете включать или запрос в списке следующим образом:

var query = { 
    lat: { $ne: ""}, 
    lon: { $ne:"" }, 
    type: "foo",    
    keywords: { $regex : "bar", $options:"i" }, 
    $or: [ 
     { isOpen: "True"}, 
     { isOpen: "False"},    
     { price: { $gte: 0}}, 
    ] 
}; 

Collection.find(query); 

Вы можете сошлитесь docs:

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

+0

Thx @chrisdam, даст ему работу после работы :) –

+0

Хотя это правда, разве это функционально тот же запрос, что OP уже использует (безуспешно)? – JohnnyHK

+0

@JohnnyHK Да, такая же функциональность, но только предполагала неявную реализацию, которая может помочь ОП понять и настроить запрос, чтобы вернуть желаемые результаты. – chridam