对聚合addToSet结果进行排序

时间:2014-02-23 10:49:10

标签: 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"}

      }}    
    ]

    );

1 个答案:

答案 0 :(得分:20)

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

我的样本:

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

我将对此进行“半引用”CTO并声明被视为无序

  

有一个真正的JIRA,谷歌团体声明就是这样的。所以让我们从“Elliot”中接受它,并接受这个成为案例。

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

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

])

然后做任何事情。但是现在您的数组已经排序了。