对聚合addToSet结果进行排序

alo*_*n_r 12 mongodb aggregation-framework

有没有办法将$ addToSet的结果作为排序数组?

我试图扩展管道和$展开数组,对它进行排序并再次分组,但结果仍然没有排序.

数组非常大,我试图避免在应用程序中对它们进行排序.


Document Example :

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

    }

查询:


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

      }}    
    ]

    );

Nei*_*unn 27

是的,这是可能的,但采取不同的方式.我只是为此提供我自己的数据,但你会得到这个概念.

我的样本:

{ "array" : [  2,  4,  3,  5,  2,  6,  8,  1,  2,  1,  3,  5,  9,  5 ] }
Run Code Online (Sandbox Code Playgroud)

我将在此基础上"半引用"CTO并声明集合被认为是无序的.

有一个真正的JIRA,谷歌团体声明就是这样的.因此,让我们把它从"长尾"和接受,这是这种情况.

因此,如果你想要一个有序的结果,你必须按照这样的阶段按摩

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

])
Run Code Online (Sandbox Code Playgroud)

然后做任何事情.但现在您的数组已排序.

  • @alon_r一点都不奇怪。尤其是**,因为我引用了MongoDB的CTO。“集合被认为是无序的”。仅供参考,“艾略特(Elliot)”也发表评论说,“集合”可能最终被认为是其“自己的”数据类型,与数组分开。因此,需要“重新铸造”区别。当您获得代表时,请投票。免费提供大量知识。 (2认同)