2015-02-06 39 views
0

我正在使用nodejs mongodb本機驅動程序。我在寫一個聊天程序。我有一個名爲dialog的集合,它具有sessionId和dateCreated(timestamp)字段。我需要按他們的最後(最大)dateCreated時間戳排序不同的sessionIds列表。我還需要20條記錄的限制。我需要使用mongodb本機驅動程序來查找按時間戳字段排序的不同ID

這裏是我到目前爲止(顯然缺乏排序):

db.collection('dialog').distinct('sessionId', 
     function(err, users){ 
      if(users.length > 10){ 
       users = users.slice(0, 20); 
      } 
      console.log("users: " + users); 


     }); 

這裏有幾個文件。

{ 
    "sessionId" : 455206183, 
    "msg" : "hi what's up?", 
    "dateCreated" : ISODate("2015-02-05T20:17:55.418Z"), 
    "_id" : ObjectId("54d3cff30e3ddb6922fbc2bb") 
}, { 
    "sessionId" : 163220612, 
    "msg" : "yo", 
    "dateCreated" : ISODate("2015-02-05T20:18:00.434Z"), 
    "_id" : ObjectId("54d3cff80e3ddb6922fbc2bc") 
} 
+0

爲此,您需要進行聚合調用(因爲這是在排序時獲得不同結果的唯一方法)。你可以發佈你正在使用的簡化模式嗎? – 2015-02-06 22:10:05

+0

我發佈了一些文檔。我不確定你的意思是減少模式。我的理解是mongo是無模式的。 – 2015-02-06 22:21:42

+2

它在技術上是,但其他庫在其上添加架構。如果你沒有你正在寫的數據的地圖,那麼你的時間就不好了。 – 2015-02-06 22:24:00

回答

0

Olli K讓我朝着正確的方向前進。在羣組之後進行排序似乎正常工作。

db.collection('dialog').aggregate([ 
     {$group: {_id:"$sessionId", dateCreated: {$first: "$dateCreated"} }}, 
     {$sort: {"dateCreated":-1}}, 
     {$limit: 20}], 
function(error, users){ 
    //do stuff 
}); 
1

正如在評論中指出的,你可能需要一個聚合來獲得想要的結果。像下面的東西可能會爲你工作:

db.dialog.aggregate([ 
    { $sort: { "$dateCreated": -1, "$sessionId": 1 }}, 
    { $group: { _id: "$sessionId", dateCreated: {$first: "$dateCreated"} }}, 
    { $limit: 20 }, 
    { $project: { sessionId: 1, _id: 0 }} 
]); 

在這裏,我們首先由不同的ID進行排序由dateCreatedsessionId,他們組的收集和挑選的$firstdateCreated(最新的),限定結果20並返回一個只包含sessionId值的對象數組。

請注意,我沒有試過這個,所以讓我知道它是否適合你。

+0

起初我得到錯誤:FieldPath字段名稱可能不以'$'開頭。當我在排序中從dateCreated和sessionId中刪除$ ...我得到20個空白對象。 – 2015-02-07 19:39:17

+0

感謝這絕對讓我走上正軌 – 2015-02-08 18:57:24

相關問題