2016-04-26 8 views
1

Ich verwende die MongoDB-Shell, um einige Ergebnisse zu erhalten, geordnet. Hier ist ein Sampler,So sortieren Sie Unterdokumente im Array-Feld?

{ 
"_id" : "32022", 
"topics" : [ 
    { 
     "weight" : 281.58551703724993, 
     "words" : "some words" 
    }, 
    { 
     "weight" : 286.6695125796183, 
     "words" : "some more words" 
    }, 
    { 
     "weight" : 289.8354232846977, 
     "words" : "wowz even more wordz" 
    }, 
    { 
     "weight" : 305.70093587160807, 
     "words" : "WORDZ" 
    }] 
} 

, was ich will zu bekommen ist, die gleiche Struktur, aber geordnet nach "topics" : []

{ 
"_id" : "32022", 
"topics" : [ 
    { 
     "weight" : 305.70093587160807, 
     "words" : "WORDZ" 
    }, 
    { 
     "weight" : 289.8354232846977, 
     "words" : "wowz even more wordz" 
    }, 
    { 
     "weight" : 286.6695125796183, 
     "words" : "some more words" 
    }, 
    { 
     "weight" : 281.58551703724993, 
     "words" : "some words" 
    }, 
    ] 
} 

ich es geschafft, einige geordnete Ergebnisse zu erhalten, aber kein Glück in ihnen durch ID-Feld zu gruppieren. Gibt es einen Weg, dies zu tun?

+0

Sie müssen uns Beispieldokumente mit dem zeigen, erwartetes Ergebnis, nicht nur was du hast. – styvane

+0

@ user3100115 überprüfen Sie die aktualisierte Frage –

Antwort

3

MongoDB bietet keine Möglichkeit, dies sofort zu tun, aber es gibt eine Problemumgehung, die darin besteht, Ihre Dokumente zu aktualisieren und den Aktualisierungsoperator $sort zum Sortieren Ihres Arrays zu verwenden.

db.collection.update_many({}, {"$push": {"topics": {"$each": [], "$sort": {"weight": -1}}}}) 

können Sie immer noch die .aggregate() Methode wie folgt verwenden:

db.collection.aggregate([ 
    {"$unwind": "$topics"}, 
    {"$sort": {"_id": 1, "topics.weight": -1}}, 
    {"$group": {"_id": "$_id", "topics": {"$push": "$topics"}}} 
]) 

Das ist aber weniger effizient, wenn alles, was Sie wollen, sortieren Sie Ihre Array ist, und Sie sollten auf jeden Fall das nicht tun.


Sie könnten immer diese Client-Seite tun, um die .sort oder sorted Funktion.

1

Wenn Sie nicht aktualisieren wollen, sondern nur Dokumente zu erhalten, können Sie die folgende Abfrage

db.test.aggregate(
[ 
    {$unwind : "$topics"}, 
    {$sort : {"topics.weight":-1}}, 
    {"$group": {"_id": "$_id", "topics": {"$push": "$topics"}}} 
] 
) 
+0

Hinzufügen von '{" $ match ": {" _id ":" 12345 "}},' für Pipeline-Parameter spuckt genau das aus, was ich bekommen möchte! –

+0

@BediE hast du bemerkt, dass dies eine kopie meiner antwort ist und dem bestehenden keinen wert hinzufügt? – styvane

0

verwenden Es funktioniert für mich:

db.getCollection('mycollection').aggregate(
{$project:{topics:1}}, 
{$unwind:"$topics"}, 
{$sort :{"topics.words":1}}) 
+0

Dies ist falsch, es wird nicht das erwartete Ergebnis geben. – styvane

Verwandte Themen