2015-01-14 4 views
2

Предположим, у меня есть массив объектов, как показано ниже.запрос для извлечения нескольких объектов в массиве в mongodb

"array" : [ 
    { 
     "id" : 1 
    }, 
    { 
     "id" : 2 
    }, 
    { 
     "id" : 2 
    }, 
    { 
     "id" : 4 
    } 
] 

Если я хочу, чтобы получить несколько объектов ({ID: 2}) из этого массива, запрос агрегации выглядит следующим образом.

db.coll.aggregate([{ $match : {"_id" : ObjectId("5492690f72ae469b0e37b61c")}}, { $unwind : "$array"}, { $match : { "array.id" : 2}}, { $group : { _id : "$_id", array : { $push : { id : "$array.id"}}}} ]) 

Выход выше агрегации

{ 
     "_id" : ObjectId("5492690f72ae469b0e37b61c"), 
     "array" : [ 
      { 
       "id" : 2 
      }, 
      { 
       "id" : 2 
      } 
     ] 
    } 

Теперь возникает вопрос: 1) извлечение из нескольких объектов из массива возможно при использовании Find() в MongoDB?

2) Что касается Производительность, является ли агрегация правильным способом? (Потому что нам нужно использовать четыре оператора трубопровода)?

3) Можно ли использовать манипуляцию Java (зацикливание массива и только сохранить {ID: 2} объекты), чтобы сделать это после того, как находки ({ "_ ид": ObjectId ("5492690f72ae469b0e37b61c")}) запроса? Потому что find однажды извлечет документ и сохранит его в ОЗУ. Но если мы используем агрегацию, для получения результата необходимо выполнить в оперативной памяти четыре операции.

Почему я задал вопрос 3): Предположим, что тысячи клиентов, обращающихся в одно и то же время, будут перезагружены оперативной памятью. Если это делается с использованием Java, меньше задач в ОЗУ.

4) Как долго рабочий набор будет в ОЗУ ??

Правильно ли я понимаю?

Пожалуйста, исправьте меня, если я ошибаюсь.

Пожалуйста, предложите мне, чтобы иметь правильное представление по этому вопросу ..

+2

1 Вопрос на вопрос. Вот как это работает. Нет другого способа фильтрации массива с помощью '.find()'. Рамка агрегации является инструментом для этого. Пожалуйста, задавайте другие вопросы как отдельные вопросы. Вопрос 4 принадлежит [dba.stackexchange.com] (http: //dba.stackexchange.com) –

+0

И обратите внимание на точку «3», как будто вы не агрегируете что-либо или не нуждаетесь в этом для какого-либо другого более позднего этапа, тогда вам, вероятно, лучше не фильтровать ваши массивы в клиенте. Все зависит от масштаба. –

+0

Агрегация происходит медленнее, чем find(). Именно по этой причине я задал вопрос 3). Так что будет правильным методом. find() + Java или aggregation()? – manojpt

ответ

3
  1. Нет, вы проецировать первый, соответствующий одному с $, вы проецируете все из них, или вы не проецировать ни один из них.

  2. No-ish. Если вам нужно работать с этим массивом, агрегация - это то, что позволит вам извлекать несколько совпадающих элементов, но правильное решение, концептуально и для производительности, заключается в разработке вашей структуры документа, чтобы эта проблема не возникала или возникала только для редких запросов чья работа не особенно важна.

  3. Да.

  4. У нас нет информации, которая позволила бы нам дать разумный ответ на этот вопрос. Это также выходит за рамки по сравнению с остальной частью вопроса и должно быть отдельным вопросом.

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