2015-07-18 3 views
0

Допустим, мы имеем следующие документы в коллекции:MongoDB выбирать документы, основанные на нескольких полях

{ 
    "_id" : ObjectId("55aa9d35dccf57b64d34f448"), 
    "a" : 1, 
    "b" : 7, 
    "c" : 0 
} 

{ 
    "_id" : ObjectId("55aa9d64dccf57b64d34f449"), 
    "a" : 2, 
    "b" : 8, 
    "c" : 1 
} 

{ 
    "_id" : ObjectId("55aa9d6bdccf57b64d34f44a"), 
    "a" : 2, 
    "b" : 7, 
    "c" : 0 
} 

Я хочу, чтобы получить все документы, в которых (a = 1 and b = 7) or (a = 2 and b = 8). Запрос всегда будет только на полях a и b, но, возможно, будет десять тысяч возможных a и b пар (комбинаций).

Есть ли способ сделать этот вид запроса с помощью оператора $in?

Если нет, то какой был бы лучший способ сделать это?

ответ

1

Основной MongoDB запрос вы пытаетесь построить это:

$or: [ 
    { a: 1, b: 7 }, 
    { a: 2, b: 8 } 
] 

Это приводит непосредственно к:

Model.where(:$or => [ 
    { :a => 1, :b => 7 }, 
    { :a => 2, :b => 8 } 
]) 

или вы могли бы использовать or метод:

Model.or(
    { :a => 1, :b => 7 }, 
    { :a => 2, :b => 8 } 
) 

Здесь вам не нужно $in, вы должны использовать $in, чтобы узнать, Поле ngle равно любому из элементов массива. Например, они эквивалентны:

where(:$or => [ { :a => 1 }, { :a => 2 } ]) 
where(:a => { :$in => [ 1, 2 ] }) 
where(:a.in => [ 1, 2 ]) # a short form of :a => { :$in => ... } 

Так $in является частным случаем ярлык для некоторых $or с.

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