2012-01-27 2 views
35

Допустим, у меня есть Монго документы, как это:Монго порядка по длине массива

Вопрос 1

{ 
    answers:[ 
     {content: 'answer1'}, 
     {content: '2nd answer'} 
    ] 
} 

Вопрос 2

{ 
    answers:[ 
     {content: 'answer1'}, 
     {content: '2nd answer'} 
     {content: 'The third answer'} 
    ] 
} 

Есть ли способ сделать заказ сбор по размеру ответов?

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

ответ

40

Я думал, что вы можете использовать $size, но это только для поиска массивов определенного размера, а не для заказа.

Из документации Монго: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

Вы не можете использовать $ размер, чтобы найти диапазон размеров (например: массивы с более чем 1 элемент). Если вам нужно запросить диапазон, создайте дополнительное поле размера, которое вы увеличиваете при добавлении элементов. Индексы не могут использоваться для части размера $ size запроса, хотя, если включены другие выражения запроса, индексы могут использоваться для поиска совпадений в этой части выражения запроса.

Похоже, вы, вероятно, может довольно легко сделать это с помощью новой системы агрегации, редактирования:, который еще не вне. http://www.mongodb.org/display/DOCS/Aggregation+Framework

Update Теперь Aggregation Framework выходит ...

> db.test.aggregate([ 
    {$unwind: "$answers"}, 
    {$group: {_id:"$_id", answers: {$push:"$answers"}, size: {$sum:1}}}, 
    {$sort:{size:1}}]); 
{ 
"result" : [ 
    { 
     "_id" : ObjectId("5053b4547d820880c3469365"), 
     "answers" : [ 
      { 
       "content" : "answer1" 
      }, 
      { 
       "content" : "2nd answer" 
      } 
     ], 
     "size" : 2 
    }, 
    { 
     "_id" : ObjectId("5053b46d7d820880c3469366"), 
     "answers" : [ 
      { 
       "content" : "answer1" 
      }, 
      { 
       "content" : "2nd answer" 
      }, 
      { 
       "content" : "The third answer" 
      } 
     ], 
     "size" : 3 
    } 
    ], 
    "ok" : 1 
} 
+0

похоже, что результат сыпучих документов без ответов массив. иногда это нормально. – Oleg

+0

Есть ли способ получить документ без ответов? Мне нравится метод '$ project' так же, как ответил @OlegGolovanov, но, как он правильно упомянул, вам нужно вручную добавить все необходимые поля - это то, что мне не нравится – Jay

22

Я использую $ проект для этого:

db.test.aggregate([ 
    { 
     $project : { answers_count: {$size: { "$ifNull": [ "$answers", [] ] } } } 
    }, 
    { 
     $sort: {"answers_count":1} 
    } 
    ]) 

Это позволяет включать также документы с пустыми ответами. Но также имеет недостаток (или иногда преимущество): вы должны вручную добавить все необходимые поля в шаге проекта.

+2

Ты герой, он работает! – Antoine

+0

отличный ответ, работает как шарм – samix73

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