Запрос MongoDB И / ИЛИ Прецедент - PullRequest
2 голосов
/ 18 декабря 2010

В MongoDB, если бы я хотел выразить A и (B ИЛИ C), я мог бы легко сделать:

db.demo.find( { a: 1, $or: [ {b:1}, {c:1} ] });

Но если бы я хотел (A и B) ИЛИ C - это, похоже, не работает. Если я попытаюсь:

db.demo.find( { $or: [ {a:1,b:1}, {c:1} ] });

выше, трактует его как A или B или C, что совпадает с

db.demo.find( { $or: [ {a:1}, {b:1}, {c:1} ] });

В данный момент я не хочу использовать выражение Javascript $, где это можно сделать (но у меня не будет выбора, если ничего не работает) - причина в том, что я создаю общие правила фильтрации, которые напрямую преобразуется в запрос MongoDB.

Любая помощь?

1 Ответ

1 голос
/ 18 декабря 2010

Запрос работает фактически так, как и должен.Вопрос неправильный.

Вот как выглядит то, что я пробовал и как оно работает!

Данные:

> db.demo.find() 
{ "_id" : 1, "age" : 38, "mgmt" : "no", "salary" : 100 } 
{ "_id" : 2, "age" : 45, "salary" : 200, "mgmt" : "no" } 
{ "_id" : 3, "age" : 50, "salary" : 250, "mgmt" : "no" } 
{ "_id" : 4, "age" : 51, "salary" : 75, "mgmt" : "yes" } 
{ "_id" : 5, "age" : 45, "salary" : 75, "mgmt" : "no" } 

Запрос на получение (Возраст> 40 ANDЗарплата> 200) ИЛИ mgmt = 'да'

> db.demo.find( { $or: [ { age: {$gt:40}, salary:{$gt:200} }, {mgmt: 'yes'} ] }) 
{ "_id" : 3, "age" : 50, "salary" : 250, "mgmt" : "no" } 
{ "_id" : 4, "age" : 51, "salary" : 75, "mgmt" : "yes" } 

Запрос на получение (Возраст> 40) ИЛИ (Зарплата> 200) ИЛИ mgmt = 'да'

> db.demo.find( { $or: [ { age: {$gt:40}}, {salary:{$gt:201} }, {mgmt: 'yes'} ] }) 
{ "_id" : 2, "age" : 45, "salary" : 200, "mgmt" : "no" } 
{ "_id" : 3, "age" : 50, "salary" : 250, "mgmt" : "no" } 
{ "_id" : 4, "age" : 51, "salary" : 75, "mgmt" : "yes" } 
{ "_id" : 5, "age" : 45, "salary" : 75, "mgmt" : "no" } 

Всеони работают как надо.Большой!

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