2014-02-23 274 views
9

有没有办法将$ addToSet的结果作为排序数组?排序聚合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"} 

     }}  
    ] 

    ); 

回答

18

是的,它是可能的,但不同的方法处理它。我只是提供我自己的数据,但你会得到这个概念。

我的样本:

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

]) 

然后为所欲为。但是现在你的数组已经排序了。

+1

这是正确的!但奇怪的是,当在最后阶段我使用$ addToSet而不是$推它没有命令。 –

+1

@alon_r这并不奇怪。 **特别**是因为我从MongoDB的CTO引用的内容。 “Set's被认为是无序的”。仅供参考,“Elliot”也提出**集**可能最终被认为是**自己的**数据类型,与数组分开。因此需要重新区分这个区别。当你得到一些代表时进行投票。这是免费的许多知识。 –