首页 文章

对聚合addToSet结果进行排序

提问于
浏览
9

有没有办法将$ 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 回答

  • 19

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

    我的样本:

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

    我将在这个问题上担任首席技术官,并声明 Sets 被认为是 unordered .

    有一个真正的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" }}}
    
    ])
    

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

相关问题