MongoDB clasifica documentos por elementos de matriz

Tengo estructura de documento como:

{ map: 'A', points: [ { type: 'type1', distanceToSpawn: 110 }, { type: 'type4', distanceToSpawn: 40 }, { type: 'type6', distanceToSpawn: 30 } ] }, { map: 'B', points: [ { type: 'type1', distanceToSpawn: 100 }, { type: 'type2', distanceToSpawn: 60 }, { type: 'type3', distanceToSpawn: 25 } ] }, { map: 'C', points: [ { type: 'type2', distanceToSpawn: 90 }, { type: 'type3', distanceToSpawn: 1 }, { type: 'type6', distanceToSpawn: 76 } ] } 

Quiero que todos los mapas tengan el tipo de punto type1 ordenado por distanceToSpawn en orden ascendente.

Resultado Esperado :

 { map: 'B', points: [ { type: 'type1', distanceToSpawn: 100 } ] }, { map: 'A', points: [ { type: 'type1', distanceToSpawn: 110 } ] } 

He intentado algo como:

 db.maps.find({'points.type': {$eq : 'type1'}}, {map: 1, 'points.$':1}).sort({'points.distanceToSpawn': 1}).limit(10) 

Pero esto no ordena los mapas por orden ascendente.

Gracias.

No se puede hacer eso con las matrices, y el principal problema aquí es porque quieres que ocurra el “género” en el elemento coincidente. Si desea ordenar resultados como este, entonces necesita usar .aggregate() . Ya sea como:

Para las versiones modernas de MongoDB:

 db.maps.aggregate([ { "$match": { "points.type": "type1" }}, { "$addFields": { "order": { "$filter": { "input": "$points", "as": "p", "cond": { "$eq": [ "$$p.type", "type1" ] } } } }}, { "$sort": { "order": 1 } } ]) 

Para MongoDB 2.6 a 3.0

 db.maps.aggregate([ { "$match": { "points.type": "type1" }}, { "$project": { "points": { "$setDifference": ] { "$map": { "input": "$points", "as": "p", "in": { "$cond": [ { "$eq": [ "$$p.type", "$type1" ] }, "$$p", false ]} }}, [false] ] } }}, { "$sort": { "points.distanceToSpawn": 1 } } ]) 

O menos eficiente en versiones anteriores a MongoDB 2.6:

 db.maps.aggregate([ { "$match": { "points.type": "type1" }}, { "$unwind": "$points" }, { "$match": { "points.type": "type1" }}, { "$group": { "_id": "$id", "points": { "$push": "$points" } }}, { "$sort": { "points.ditanceToSpawn": 1 } } ]) 

Esa es la única forma de hacer coincidir los elementos correctos y tenerlos en cuenta en una operación de “clasificación”. La ordenación del cursor por defecto simplemente considerará los valores para el campo en los elementos de la matriz que no coinciden con su “tipo” seleccionado.