le mode de tri de tableau à l'intérieur de la collection enregistrement dans mongoDB
MongoDB noob ici...
Ok, j'ai une collection d'étudiants, chacun avec un dossier qui ressemble à la suivante.... Je veux le 'type' : 'devoirs' scores dans l'ordre décroissant.
ce n'est que incantation ressembler sur le shell mongo?
> db.students.find({'_id': 1}).pretty()
{
"_id" : 1,
"name" : "Aurelia Menendez",
"scores" : [
{
"type" : "exam",
"score" : 60.06045071030959
},
{
"type" : "quiz",
"score" : 52.79790691903873
},
{
"type" : "homework",
"score" : 71.76133439165544
},
{
"type" : "homework",
"score" : 34.85718117893772
}
]
}
Je vais essayer cette incantation....
doc = db.students.find()
for (_id,score) in doc.scores:
print _id,score
mais cela ne fonctionne pas.
Vous devez vous connecter pour publier un commentaire.
Vous devez manipuler l'embedded tableau dans le code de votre application ou de l'utilisation de la nouvelle L'Agrégation Cadre dans MongoDB 2.2.
Exemple d'agrégation dans la
mongo
shell:Exemple de sortie:
C'est comment nous pourrions résoudre ce avec JS et mongo console:
{"scores.type": "homework"}
expression de filtre à l'intérieur de find() de parvenir à quelque chose?Voici le code java qui peut être utilisé pour trouver le score le plus bas dans le tableau et de le supprimer.
dbObject
dedbObjectList
, le retirer de lacur
DBObject? Quel est le lien entrecur
etdbObjectList
?Il est assez facile à deviner, mais de toute façon, essayez de ne pas tricher avec mongo cours à l'université parce que vous n'aurez pas de comprendre les bases, alors.
Depuis que cette question peut être géré de différentes manières, je veux dire qu'une autre solution est "insérer et de tri", de cette façon, vous obtiendrez le tableau Ordonné à l'instant, vous êtes en fait un Find().
Tenir compte de ces données:
Ici, nous allons mettre à jour le Document, faire le Tri.
Résultat est:
De la Documentation:
https://docs.mongodb.com/manual/reference/operator/update/sort/#up._S_sort
Je crois que vous faites
M101P: MongoDB for Developers
où les devoirs 3.1 est de supprimer la partie inférieure de deux devoirs des scores. Depuis agrégations n'ont pas été appris jusqu'à ce point que vous pouvez faire quelque chose comme ceci:la réponse de @Stennie est bien, peut-être un $groupe opérateur serait utile de conserver le document original, sans exploser dans de nombreux documents (un par score).
Je viens de l'ajouter une autre solution lors de l'utilisation de javascript pour votre application.
si vous interrogez un seul document, il est parfois plus facile de trier les incorporés de tableau en JS, au lieu de faire un agrégat.
Lorsque votre document contient un grand nombre de domaines, c'est encore mieux que d'utiliser $pousser opérateur, sinon vous avez de pousser tous les champs un par un, ou utiliser $$ROOT opérateur (je me trompe ?)
Mon exemple de code utilise Mongoose.js :
Supposons que vous avez initialisé, vous, Étudiants, modèle.
ce travail pour moi, c'est un peu brut de code, mais les résultats les plus bas de tâches pour chaque élève sont corrects.
C'est mon approche à l'aide de pyMongo, le pilote Python pour MongoDB:
C'est de cette façon que j'ai implémenté en Java (qui Ont gardé les choses simples de sorte qu'il est plus facile à comprendre) -
Approche :
Ci-dessous est de travailler de code Java:
Certes, il est tard, mais je veux juste apporter ma propre solution sur Mongo Shell:
Dans l'ordre de tri de tableau, procédez comme suit:
1) détendez-vous utiliser pour parcourir tableau
2) tri un tableau
3) de groupe à fusionner des objets de tableau dans un tableau
4) ensuite le projet à d'autres champs
Requête
trier par le score peut être simple comme:
mais vous avez besoin de trouver celle du type:les devoirs ...
db.students.updateMany({}, {'$push':{'scores':{'$each':[], '$sort':{'score': 1}}}})
par mongodb documentationil devrait être quelque chose comme ceci: