Esta es la respuesta más acertada que encomtrarás aportar, pero obsérvala detenidamente y analiza si es compatible a tu trabajo.
Solución:
Tendrá que manipular el incrustado array en el código de su aplicación o utilizando el nuevo marco de agregación en MongoDB 2.2.
Ejemplo de agregación en el mongo
cascarón:
db.students.aggregate(
// Initial document match (uses index, if a suitable one is available)
$match:
_id : 1
,
// Expand the scores array into a stream of documents
$unwind: '$scores' ,
// Filter to 'homework' scores
$match:
'scores.type': 'homework'
,
// Sort in descending order
$sort:
'scores.score': -1
)
Salida de muestra:
"result" : [
"_id" : 1,
"name" : "Aurelia Menendez",
"scores" :
"type" : "homework",
"score" : 71.76133439165544
,
"_id" : 1,
"name" : "Aurelia Menendez",
"scores" :
"type" : "homework",
"score" : 34.85718117893772
],
"ok" : 1
Así es como podríamos resolver esto con JS y mongo console:
db.students.find("scores.type": "homework").forEach(
function(s)
var sortedScores = s.scores.sort(
function(a, b)
return a.score
Dado que esta pregunta se puede manejar de diferentes maneras, quiero decir que otra solución es "insertar y ordenar", de esta manera obtendrá el Ordenado array en este momento harás un Find().
Considere estos datos:
"_id" : 5,
"quizzes" : [
"wk": 1, "score" : 10 ,
"wk": 2, "score" : 8 ,
"wk": 3, "score" : 5 ,
"wk": 4, "score" : 6
]
Aquí actualizaremos el Documento, haremos el Sort.
db.students.update(
_id: 5 ,
$push:
quizzes:
$each: [ wk: 5, score: 8 , wk: 6, score: 7 , wk: 7, score: 6 ],
$sort: score: -1 ,
$slice: 3 // keep the first 3 values
)
El resultado es:
"_id" : 5,
"quizzes" : [
"wk" : 1, "score" : 10 ,
"wk" : 2, "score" : 8 ,
"wk" : 5, "score" : 8
]
Documentación: https://docs.mongodb.com/manual/reference/operator/update/sort/#up._S_sort
Nos encantaría que puedieras dar difusión a este post si te fue de ayuda.