Tengo una colección (llamada menucategories ) en 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
        }
    ]
}

Cada categoría de menú tiene una matriz llamada menús . Y cada menú (elemento de la matriz) tiene código . El ' código ' de los menús es único en cada menú . Quiero obtener el valor máximo del código del menú (en este caso, 11 ). ¿Cómo puedo conseguir esto?

1
Jeffrey Kang 26 dic. 2016 a las 10:11

3 respuestas

La mejor respuesta

Si desea encontrar el valor máximo de código de todos los códigos de menús, la consulta probable será la siguiente:

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

Haga clic en los enlaces a continuación para obtener más información sobre los diferentes operadores:

$ unwind, $ group, $ proyecto

3
Dhruv 26 dic. 2016 a las 09:47

No necesita usar el operador de canalización de agregación $unwind aquí porque a partir de MongoDB 3.2, algunos las expresiones de acumulador están disponibles en la etapa $project.

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

En respuesta a un comentario ahora eliminado, no es necesario que coloque su canalización en una matriz, por lo que la siguiente consulta también funcionará.

db.collection.aggregate(
    {"$project": {"maxPerDoc": {"$max": "$menus.code"}}}, 
    {"$group": {"_id": null, "maxValue": {"$max": "$maxPerDoc"}}}
)
0
styvane 26 dic. 2016 a las 10:36

Prueba con la agregación:

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

No necesita relajarse, si necesita encontrar solo el valor máximo.

-2
Morales Batovski 26 dic. 2016 a las 12:30