2017-04-21 6 views
2

Ich habe SQL Server für eine lange Zeit und nur wirklich lernen MongoDB. Ich versuche herauszufinden, wie man die Aggregatfunde macht, um nur die Daten zu erhalten, die ich möchte. Hier ist ein Beispiel aus der Datenbank:Node.js Aufruf MongoDB mit Aggregat finden

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

Was ich tun möchte, ist jede eindeutige User_id Abteilungs 1 zu finden, nehmen Sie nur den Datensatz mit der aktuellen Zeit und mir sagen, ob sie oncall sind oder nicht. Im obigen Beispiel ist der Benutzer 123-88 jetzt nicht oncall. Wie würden Sie diese Abfrage machen? Ich weiß, dass Sie so etwas brauchen werden:

Aber ich halte Fehler, also weiß ich, dass ich in meiner Logik nicht richtig bin. Ich weiß, wenn ich nur die Übereinstimmung habe, funktioniert es, und wenn ich die Sortierung hinzufüge, stimmt es überein und sortiert, aber die letzte Gruppe funktioniert nicht. Auch was ich hinzufügen würde, zeige dann nur die Leute die angerufen werden. Danke nochmal für deine Hilfe.

+0

Es funktioniert nicht, weil 'current_type' ein Akku sein muss. Wenn Sie jeden 'type' in' current_type' haben möchten, können Sie [$ push] (https://docs.mongodb.com/manual/reference/operator/aggregation/push/#grp._S_push) verwenden. – luisenrike

+0

Danke luisrenike. Ich denke ich verstehe es nicht. Ich dachte, die Gruppe würde mir einfach alle Benutzer-ID, Typ und letzte Zeit für jede der verschiedenen Benutzer-IDs zurückgeben. Ist das nicht korrekt? –

+0

Ja, das stimmt. – luisenrike

Antwort

0

können Sie zählen, wie viele „Typen“ pro user_id Sie haben, kann dies durch $sum erfolgen, wenn es seltsam ist, kann der Benutzer oncall ist, weil es eine start ohne stop ist. Dieser Ansatz ist nur dann korrekt, wenn Sie immer eine stop für eine start haben.

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

Ja, das hat funktioniert. Ich sehe, was du gemacht hast (auf der Suche nach merkwürdig, da du bei jedem Start einen Stopp haben würdest). Ich muss mir auch den $ push ansehen, da es mehr Daten gibt, die ich gerne zurückschicken würde, aber diese Lösung gibt mir die user_ids und das letzte Mal, wenn die Benutzer eingeloggt sind. Nochmals vielen Dank für Ihre schnelle Antwort. –