2016-12-26 3 views
1

У меня есть коллекция (названный menucategories) в MongoDB 3.2.11:Как получить максимальное значение во вложенных документах?

{ 
    "_id" : ... 
    "menus" : [ 
     { 
      "code":0 
     }, 
     { 
      "code":1 
     }, 
     { 
      "code":2 
     }, 
     { 
      "code":3 
     } 
    ] 
}, 
{ 
    "_id" : ... 
    "menus" : [ 
     { 
      "code":4 
     }, 
     { 
      "code":5 
     }, 
     { 
      "code":6 
     }, 
     { 
      "code":7 
     } 
    ] 
}, 
{ 
    "_id" : ... 
    "menus" : [ 
     { 
      "code":8 
     }, 
     { 
      "code":9 
     }, 
     { 
      "code":10 
     }, 
     { 
      "code":11 
     } 
    ] 
} 

Каждый menucategory имеет массив с именем меню. И каждое меню (элемент массива) имеет код. «код» меню уникален в каждом меню. Я хочу получить максимальное значение кода меню (в данном случае). Как я могу это достичь?

+0

Возможный дубликат [MongoDB, как получить максимальную отдачу от коллекций] (http://stackoverflow.com/questions/32076382/mongodb-how-to-get-max-value-from-collections) –

+0

@ SmitaAhinave это не действительный дубликат. Op специально упомянул, что они находятся на MongoDB 3.2 – styvane

ответ

3

Если вы хотите, чтобы найти максимальное значение коды из всех меню коды, то вероятно, запрос будет выглядеть следующим образом:

db.menucategories.aggregate([ 
    { $unwind: '$menus' }, 
    { $group: { _id: null, max: { $max: '$menus.code' } } }, 
    { $project: { max: 1, _id:0 } } 
]) 

Нажмите ниже ссылок для получения дополнительной информации относительно различных операторов:

$unwind, $group, $project

+0

Ваш комментарий к удаленному ответу @ ShaishabRoy неверен. Вам не всегда нужно указывать конвейер в массиве. Также обратите внимание, что OP использует MongoDB 3.2, что означает, что ваш ответ здесь только * фактически * правильный. – styvane

-2

Попробуйте с агрегацией:

db.collection.aggregate({ $group : { _id: 1, max: { $max: {$max : "$menus.code"}}}}); 

Нет необходимости каких-либо размотки, если вам нужно только найти максимальное значение.

+1

дайте мне знать, что является ошибкой в ​​этом для голосования в прямом эфире.? – kittu

0

Здесь вам не нужно использовать оператор конвейерного агрегата , поскольку начиная с MongoDB 3.2, некоторые accumulator expressions являются availa на этапе $project.

db.collection.aggregate([ 
    {"$project": {"maxPerDoc": {"$max": "$menus.code"}}}, 
    {"$group": {"_id": null, "maxValue": {"$max": "$maxPerDoc"}}} 
]) 

В ответ на предыдущий комментарий удален Теперь, вам не нужно положить трубопровод в массиве, так что следующий запрос будет работать.

db.collection.aggregate(
    {"$project": {"maxPerDoc": {"$max": "$menus.code"}}}, 
    {"$group": {"_id": null, "maxValue": {"$max": "$maxPerDoc"}}} 
) 
Смежные вопросы