Me gustaría devolver los documentos en un orden ordenados por el que tiene el menor foo.bar valor (que son objetos de la matriz).

Puedo hacer db.collection.find().sort({foo.0.bar: 1}), pero esto sólo coincide con el primer elemento de la matriz – y como se puede ver en el ejemplo siguiente tipo de elemento 1 de la primera (foo.0.barra = 5), mientras que yo estoy mirando para devolver el artículo 2 de la primera (foo.2.bar = 4) como tiene el objeto con el valor más bajo.

{
    "name": "Item 1",
    "foo": [
        {
            "bar": 5
        },
        {
            "bar": 6
        },
        {
            "bar": 7
        }
    ]
}
{
    "name": "item 2",
    "foo": [
        {
            "bar": 6
        },
        {
            "bar": 5
        },
        {
            "bar": 4
        }
    ]
}
  • db.de la colección.find().sort({foo.bar: 1})
InformationsquelleAutor | 2011-03-15

4 Comentarios

  1. 19

    Parece mongo puede hacer esto.

    Por ejemplo, si tengo los siguientes documentos:

    { a:{ b:[ {c:1}, {c:5 } ] } }
    { a:{ b:[ {c:0}, {c:12} ] } }
    { a:{ b:[ {c:4}, {c:3 } ] } }
    { a:{ b:[ {c:1}, {c:9 } ] } }

    Y ejecute el siguiente:

    db.collection.find({}).sort({ "a.b.c":1 });
    //produces:
    { a:{ b:[ {c:0}, {c:12} ] } }
    { a:{ b:[ {c:1}, {c:5 } ] } }
    { a:{ b:[ {c:1}, {c:9 } ] } }
    { a:{ b:[ {c:4}, {c:3 } ] } }
    
    db.collection.find({}).sort({ "a.b.c":-1 });
    //produces:
    { a:{ b:[ {c:0}, {c:12} ] } }
    { a:{ b:[ {c:1}, {c:9 } ] } }
    { a:{ b:[ {c:1}, {c:5 } ] } }
    { a:{ b:[ {c:4}, {c:3 } ] } }

    Como se puede ver, la ordenación por {"a.b.c":1} toma la min de todos los valores en la matriz y tipo en que, mientras que la ordenación por {"a.b.c":-1} toma la max de todos los valores.

    • Tanto las salidas están produciendo el mismo resultado. Es eso correcto?
    • usted tiene que mirar de cerca. primer resultado es asceding 0, 1, 1, 3. la segunda es descendente 12,9,5,4.
  2. 4

    Una alternativa al uso de map/reduce, es almacenar el valor mínimo de la matriz como un campo separado en el documento que usted podría entonces el orden en. Cuando se agrega a la matriz, la actualización de este campo si el nuevo valor es menor que el grabado mínimo.

    por ejemplo, su primer documento sería esta (nota «minbar añadido»):

    {
        "name": "Item 1",
        "minbar" : 5,
        "foo": [
            {
                "bar": 5,
            }
            {
                "bar": 6,
            }
            {
                "bar": 7,
            }
        ]
    }
    • Esta es una gran idea – y funcionan bien en este ejemplo concreto. Pero en un esquema más complejo donde esto puede ser necesario por varias matrices (es decir, mi mundo real esquema) llegaría a ser un poco desordenado.
  3. 4

    Puede hacer como una especie de conjunto de comandos de mongo versión 2.2:

        db.collection.aggregate([{$unwind: "$foo"},
        {$project: {bars:"$foo.bar"}},
        {$group: {_id:"$_id",min:{$min: "$bars"}}},
        {$sort: {min:1}}])
  4. 0

    No hay una manera directa de hacer esto en mongo. Usted tendría que usar map/reduce a recuperar el min val en cada matriz y, a continuación, ordenar por ese valor min

    • Gracias. Pero ¿qué sería de la map/reduce la función de la mirada, como en el ejemplo?

Dejar respuesta

Please enter your comment!
Please enter your name here