2014-02-23 8 views
9

Gibt es eine Möglichkeit, das Ergebnis von $ addToSet als sortiertes Array zu erhalten?Sortierung Aggregation addToSet Ergebnis

Ich versuchte, die Pipeline zu erweitern und das Array abzuwickeln, sortiere es und gruppiere es erneut, , aber das Ergebnis ist noch nicht sortiert.

Die Arrays sind ziemlich groß und ich versuche zu vermeiden, sie in der Anwendung zu sortieren.

 

Document Example : 

    { 
     "_id" : ObjectId("52a84825cc8391ab188b4567"), 
     "id" : 129624 
     "message" : "Sample", 
     "date" : "12-09-2013,17:34:34", 
     "dt" : ISODate("2013-12-09T17:34:34.000Z"), 

    } 

Abfrage:

 

    db.uEvents.aggregate(
    [ 
     {$match : {dt : {$gte : new Date(2014,01,01) , $lt : new Date(2015,01,17)}}} 
     ,{$sort : {dt : 1}} 
     , {$group : { 
     _id : { 
       id : "$id" 
       , year : {'$year' : "$dt"} 
       , month : {'$month' : "$dt"} 
       , day : {'$dayOfMonth' : "$dt"} 
      } 
     ,dt : {$addToSet : "$dt"} 

     }}  
    ] 

    ); 

Antwort

18

Ja, es ist möglich, aber es anders angehen. Ich stelle nur meine eigenen Daten zur Verfügung, aber Sie werden das Konzept bekommen.

Mein Beispiel:

{ "array" : [ 2, 4, 3, 5, 2, 6, 8, 1, 2, 1, 3, 5, 9, 5 ] } 

Ich werde "semi-Zitat" das CTO auf diese und erklären, dass Sets gelten als ungeordnete sein.

Es gibt eine tatsächliche JIRA, Google Groups-Anweisung, die so etwas geht. Also nehmen wir es von "Elliot" und akzeptieren, dass der Fall sein wird.

Wenn Sie also eine geordnete Folge wollen, müssen Sie mit Stufen auf diese Weise massieren wie diese

db.collection.aggregate([ 

    // Initial unwind 
    {"$unwind": "$array"}, 

    // Do your $addToSet part 
    {"$group": {"_id": null, "array": {"$addToSet": "$array" }}}, 

    // Unwind it again 
    {"$unwind": "$array"}, 

    // Sort how you want to 
    {"$sort": { "array": 1} }, 

    // Use $push for a regular array 
    {"$group": { "_id": null, "array": {"$push": "$array" }}} 

]) 

Und dann tun, was auch immer. Aber jetzt ist Ihr Array sortiert.

+1

Das ist richtig! aber es ist seltsam, dass wenn ich auf der letzten Stufe $ addToSet benutze und nicht $ push es nicht bestellt. –

+1

@alon_r Es ist überhaupt nicht seltsam. Und ** speziell ** wegen dem, was ich vom CTO von MongoDB zitierte. "Sets werden als ungeordnet angesehen". FYI, "Elliot" hat auch Kommentare gemacht, dass ** Sets ** möglicherweise als ** eigener ** Datentyp betrachtet werden, getrennt von Arrays. Daher die Notwendigkeit, * die Unterscheidung umzugestalten. Up-vote, wenn Sie einen Vertreter bekommen. Das ist viel Wissen umsonst. –

Verwandte Themen