2017-04-21 77 views
2

我已經使用SQL Server很長一段時間,只是真正學習MongoDB。我想弄清楚如何做聚合發現以獲得我想要的數據。下面是從數據庫中的樣本:Node.js調用MongoDB的聚合查找

{ 
    "_id": "1", 
    "user_id": "123-88", 
    "department_id": "1", 
    "type": "start", 
    "time": "2017-04-20T19:40:15.329Z" 
} 

{ 
    "_id": "2", 
    "user_id": "123-88", 
    "department_id": "1", 
    "type": "stop", 
    "time": "2017-04-20T19:47:15.329Z" 
} 

我想要做的就是找到部門1的每個唯一USER_ID什麼,只需要使用最新的時間記錄,並告訴我,如果他們是OnCall中與否。所以在上面的例子中,用戶123-88現在沒有通話。你如何做這個查詢?我知道你會需要這樣的東西:

TimeCard.aggregate([ 
    { $match: {department_id: req.query.department_id}}, 
    { $sort: { user_id: 1, time: 1 }}, 
    { $group: { _id: "$user_id", current_type: "$type", lastTime: { $last: "$time" }}} 
    ], function(err, docs){ 
     if(err){console.log(err);} 
     else {res.json(docs);} 
    }); 

但我一直錯誤,所以我知道我在我的邏輯不正確。我知道如果我只是匹配它的作品,並且如果我添加它匹配和排序的排序,但最終的組不起作用。此外,我會添加什麼,然後只顯示oncall的人。再次感謝你的幫助。

+0

它不工作,因爲'current_type'必須是累加器。如果你想在'current_type'中擁有每一個'type',你可以使用[$ push](https://docs.mongodb.com/manual/reference/operator/aggregation/push/#grp._S_push)。 – luisenrike

+0

謝謝luisenrike。我想我不明白。我雖然該組只會讓我回到每個不同user_id的所有user_id,type和lasttime。這是不正確的? –

+0

是的,沒錯。 – luisenrike

回答

0

你可以指望有多少每user_id「類型」你,這可以通過$sum完成,如果是奇數,則該用戶OnCall中,因爲有一個start沒有stop。只有當您始終擁有stopstart)時,此方法纔是正確的。

TimeCard.aggregate([ 

    { $match: { department_id: req.query.department_id } }, 
    { $sort: { user_id: 1, time: 1 } }, 
    { $group: { _id: "$user_id", count_types: { $sum: 1 }, lastTime: { $last: "$time" }}}, 
    { $match: { count_types: { $mod: [ 2, 1 ] } } }, 

], function(err, docs) { 
    if(err) { console.log(err); } 
    else { res.json(docs); } 
}); 
+0

是的,工作。我看到你做了什麼(尋找奇怪,因爲你每次開始都會停下來)。我還需要看看$ push,因爲如果可能的話,我想發送更多的數據,但是這個解決方案確實給了我用戶ID和用戶輸入時的最後時間。再次感謝您的快速回復。 –