2016-05-06 16 views
1

Ich benutze Knoten mit mongodb.Ich versuche geschachtelte Array zu sortieren.Node + Mongodb + sortierte verschachtelte Array

Beispiel json in Monogodb.

{ 
    "items": [ 
     { 
      "name": "A", 
      "order": 3 
     }, { 
      "name": "B", 
      "order": 2 
     }, { 
      "name": "C", 
      "order": 1 
     }, { 
      "name": "D", 
      "order": 4 
     } 
    ], 
    "name": "Test", 
     "_id" : 01245678913 
} 
{ 
    "items": [ 
     { 
      "name": "A", 
      "order": 3 
     }, { 
      "name": "B", 
      "order": 2 
     }, { 
      "name": "C", 
      "order": 1 
     }, { 
      "name": "D", 
      "order": 4 
     } 
    ], 
    "name": "Test", 
     "_id" : 098765432134 
} 

Ich erwarte Ergebnis sollte basierend auf Bestellung angezeigt werden. items.order

Hier möglich ID übergeben. Wenn "Id erhalten" angezeigt wird, wird das Ergebnis für die jeweilige ID angezeigt. Ansonsten müssen alle Listen angezeigt werden.

angebracht ich meinen Knoten Code:

router.post('/get', function(req, res, next) { 

     var results = { 
      resp : {}, 
      id : null, 
      query : {} 
     }; 

     if (!(typeof req.body['id'] === 'undefined' || req.body['id'] === null)) { 
      results.id = req.body['id']; 
     } 

     Q(results).then(function(results) { 
      var deferred = Q.defer(); 
      var collection = mongoUtil.list; 
      if (results.id != null) { 
       results.query._id = ObjectId(results.id); 
      } 


      collection.find(results.query).toArray(function(err, lists) { 

       if (!err && lists.length > 0) { 
        results.resp.lists = lists; 
        deferred.resolve(results); 
       } else { 

        results.resp.message = 'No List'; 
        results.resp.debug = err; 
        deferred.reject(results); 
       } 
      }); 
      return deferred.promise; 
     }).then(function(results) { 
      results.resp.message = 'Result found'; 
      results.resp.status = 'Success'; 
      res.send(results.resp); 
     }).fail(function(results) { 
      results.resp.status = 'Error'; 
      res.send(results.resp); 
     }); 

    }); 

ich einige Beispiele fand sie Aggregat-Funktion.

collection.aggregate([ 
    {$unwind: "$answers"}, 
    {$sort: {"item.order":1}}, 
    {$group: {_id:"$_id", answers: {$push:"$answers"}}} 
]); 

Hier ein bisschen verwirrend.

+0

Die 'aggregate' Sie sind darauf hindeutet, sieht gut für mich. Was schief gelaufen ist? – hyades

+0

Der obige Code funktioniert nicht für mich. ==== >>>> collection.aggregate ([ {$ abwickeln: "$ antworten"}, {$ sort: {"item.order": 1}}, {$ group: {_id: "$ _id ", Antworten: {$ push:" $ answers "}}} ]); – RSKMR

Antwort

1

Aggregationen Operationen verarbeiten Datensätze und geben berechnete Ergebnisse zurück. Aggregationsvorgänge gruppieren Werte aus mehreren Dokumenten zusammen und können eine Vielzahl von Operationen für die gruppierten Daten ausführen, um ein einzelnes Ergebnis zurückzugeben.

Try this -

collection.aggregate([ 
    { $unwind: "$items" }, 
    { $sort: { "items.order": 1 } }, 
    { $group: { _id: "$_id", items: { $push: "$items" } } } 
]); 

db.collection.aggregate (Pipeline, Optionen): - Aggregatwerte Berechnet für die Daten in einer Sammlung.

Pipeline $ abwickeln (Aggregation) Stufe: - Dekonstruiert ein Array-Feld aus den Eingabedokumenten, um ein Dokument für jedes Element auszugeben. Jedes Ausgabedokument ist das Eingabedokument, wobei der Wert des Felds Array durch das Element ersetzt wird.

Examples-

eine Bestands Elemente als mit dem folgenden Dokument:

{ "_id" : 1, "item" : "ABC1", sizes: [ "S", "M", "L"] }

Die folgende Aggregation verwendet die $ Abwickelstation Stufe ein Dokument für jedes Element, um Ausgangs in der Größenmatrix:

db.items.aggregate([ { $unwind : "$sizes" } ])

Der Betrieb liefert folgende Ergebnisse:

{ "_id" : 1, "item" : "ABC1", "sizes" : "S" } { "_id" : 1, "item" : "ABC1", "sizes" : "M" } { "_id" : 1, "item" : "ABC1", "sizes" : "L" }

Pipeline $ sort (Aggregation) Stufe: - Sortiert alle Eingabedokumente und gibt sie an die Pipeline in sortiert Auftrag.

Die $ Sortierstufe hat die folgenden Prototyp Form:

{ $sort: { <field1>: <sort order>, <field2>: <sort order> ... } }

Examples-

Für das Feld oder die Felder gesetzt zu sortieren durch, die Sortierreihenfolge auf 1 oder - 1 bis geben jeweils eine aufsteigende oder absteigende Sortierung an, wie im folgenden Beispiel: :

db.users.aggregate( [ { $sort : { age : -1, posts: 1 } } ])

Pipeline $ Gruppe (Aggregation) Stufe: - Gruppen Dokumente von einigen angegebenen Ausdruck und gibt an die nächste Stufe ein Dokument für jeden deutliche Gruppierung. Die Ausgabedokumente enthalten ein _id-Feld, das die eindeutige Gruppe nach Schlüssel enthält. $ group bestellt seine Ausgabe Dokumente nicht.

Die $ Gruppenphase hat den folgenden Prototyp:

{ $group: { _id: <expression>, <field1>: { <accumulator1> : <expression1> }, ... } }

Accumulator $ Push: - Gibt ein Array aller Werte, die für jedes Dokument von Anlegen eines Ausdrucks führen in einer Gruppe von Dokumenten, die teilen die gleiche Gruppe nach Schlüssel.

$ Push hat die folgende Syntax:

{ $push: <expression> }

$ Push ist in der $ Gruppenphase zur Verfügung.

Weitere Referenz auf diesen Link sehen - https://docs.mongodb.com/manual/reference/method/db.collection.aggregate/

+0

@RSKMR, ich hoffe, das wird deine Verwirrung ein wenig klären. –

Verwandte Themen