2013-06-07 3 views
1

Я запускаю MongoDB v.2.4.4-pre-под Linux. Существует коллекция с элементами, как это:Сложный запрос MongoDB (высокий уровень вложенности)

{ 
    num: 1, 
    arr: [ 
     { 
      a: 'a1', 
      b: 'b1' 
     }, 
     { 
      a: 'a2', 
      b: 'b2' 
     } 
    ] 
} 

У меня тоже 2 значения: «numVal» и «arrVal». «numVal» - это число, а «arrVal» - это массив строк.

Задача состоит в том, чтобы выделить все элементы, где «num» == «numVal» и «a» свойство каждого элемента «arr» равно элементу «arrVal» с тем же индексом.

Например, чтобы получить описанный выше элемент, мне нужно «numVal» = 1 и «arrVal» = ['a1', 'a2'].

Помогите мне создать правильный запрос, пожалуйста? У меня есть решение, основанное на селекторе «$ where», но я думаю, что есть лучший способ.

Текущий запрос выглядит следующим образом:

db.collection.find({ num: 1, $where: "this.arr.length == 2 && this.arr[0] && this.arr[0].a == 'a1' && this.arr[1] && this.arr[1].a == 'a2'" }) 

или

db.collection.find({ num: 1, 'arr.a': { $all: [ 'a1', 'a2' ] }, arr: { $size: 2 }, $where: "this.arr[0].a == 'a1' && this.arr[1].a == 'a2'" }) 

Количество элементов, фильтруется "$, где" в большинстве случаев было бы 1 или 2, максимальное количество составляет около 20.

PS Я не могу реорганизовать свою БД.

ответ

1

Вы можете успешно использовать следующий запрос:

db.collection.find({ num: 1, arr: { $size: 2 }, 'arr.0.a': 'a1', 'arr.1.a': 'a2' }) 
Смежные вопросы