2012-09-14 24 views
12

Estoy buscando una forma de ordenar una matriz anidada de objetos. He aquí un ejemplo:MongoDB: ordena la matriz anidada de objetos

answers: [ 
      {name: 'paul', state: 'RU'}, 
      {name: 'steve', state: 'US'}, 
      {name: 'mike', state: 'DE'}, 
      ... 
     ] 

Supongamos ahora quiero encontrar toda la name, de la matriz answers, pero la clasificación en orden ascendente, ¿cómo puedo lograr eso?

Respuesta

23

Lo almacenaría en el orden en que lo desea volver a salir. O ordénelo después de sacarlo, en el lado del cliente.

Si ninguno de los que son posibles, puede utilizar la aggregation framework:

> db.test.insert({answers: [ 
...     {name: 'paul', state: 'RU'}, 
...     {name: 'steve', state: 'US'}, 
...     {name: 'mike', state: 'DE'}]}); 
> db.test.insert({answers: [ 
...     {name: 'paul', state: 'RU'}, 
...     {name: 'steve', state: 'US'}, 
...     {name: 'xavier', state: 'TX'}]}); 

db.test.aggregate([ 
    {$unwind: "$answers"}, 
    {$sort: {"answers.name":1}}, 
    {$group: {_id:"$_id", answers: {$push:"$answers"}}} 
]); 

produce:

{ 
    "result" : [ 
    { 
    "_id" : ObjectId("5053b2477d820880c3469364"), 
    "answers" : [ 
     { 
     "name" : "paul", 
     "state" : "RU" 
     }, 
     { 
     "name" : "steve", 
     "state" : "US" 
     }, 
     { 
     "name" : "xavier", 
     "state" : "TX" 
     } 
    ] 
    }, 
    { 
    "_id" : ObjectId("5053af9f7d820880c3469363"), 
    "answers" : [ 
     { 
     "name" : "mike", 
     "state" : "DE" 
     }, 
     { 
     "name" : "paul", 
     "state" : "RU" 
     }, 
     { 
     "name" : "steve", 
     "state" : "US" 
     } 
    ] 
    } 
], 
    "ok" : 1 
} 
-2

Después de realizar una búsqueda() se puede usar sort() en el valor de retorno.

db.collection.find({},{"answers.name":1}).sort({"answers.name":1}) 

El hallazgo extraería los campos de nombre de todos los documentos de la colección. El género los ordenaría por su nombre, ascendiendo.

http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order

+1

Necesita comillas en las teclas '" answers.name "'. Pero no creo que su código haga lo que está buscando ... –

+4

Su ejemplo mostrará una lista de todos los documentos con su campo '_id' y' nombre', ordenados por el primer nombre en cada conjunto. El 'sort()' funciona en el nivel del documento y no reordena las matrices dentro de los documentos. – Stennie

4

Esto podría no ser útil en este contexto, pero pensé que me gustaría añadir esto. También tiene la opción de ordenarlo en la escritura que tiende a ser mejor para las colecciones desnormalizadas donde no tiene que ordenar más de una forma.

Encontré esta situación en mi aplicación al crear un feed en un usuario.

Meteor.users.helpers({ 
    'addToFeed': function (gameId, pushData) { 
    check(pushData, FeedSchema); 
    Meteor.users.update({ 
     _id: this._id, 
     "games.gameId": gameId 
    }, { 
     $push: { 
     "games.$.feed": { 
      $each: [pushData], 
      $sort: { timestamp: -1 } 
     } 
     } 
    }); 
    } 
}); 

Me pareció que estaba bastante práctico porque luego se puede utilizar find() y se ordenan por sus especificaciones por defecto.

+0

Recibo un error minimongo sobre no poder establecer el campo llamado $ ... ¿Alguna idea? Creo que esto es muy parecido a lo que quiero – lol

Cuestiones relacionadas