Sorting aggregation addToSet result

强颜欢笑 提交于 2019-12-17 19:34:50

问题


Is there a way to get result of $addToSet as sorted array ?

I tried to expand the pipeline and $unwind the array, sort it and group it again , but still the result isn't sorted.

The arrays are pretty big and i try to avoid sort them in the the application.


Document Example :

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

    }

Query :


    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"}

      }}    
    ]

    );


回答1:


Yes it is possible, but approach it differently. I'm just provide my own data for this, but you'll get the concept.

My Sample:

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

I'm going to "semi-quote" the CTO on this and state that Sets are considered to be unordered.

There is an actual JIRA, Google groups statement that goes something like that. So let's take it from "Elliot" and accept that this will be the case.

So if you want an ordered result, you have to massage that way with stages like this

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" }}}

])

And then do whatever. But now your array is sorted.



来源:https://stackoverflow.com/questions/21967233/sorting-aggregation-addtoset-result

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!