2016-05-13 13 views
2

Ich habe eine Situation, in der ich Daten zwischen zwei Sammlungen korrelieren muss.Finden Sie das erste Dokument nach einem bestimmten Datum

Ich möchte die Zeit von einem Dokument in einer Sammlung abrufen und dann entweder das erste Dokument finden, das nach oder nach dieser Zeit in einer anderen Sammlung erscheint.

Die Zeiten sind in der Regel nicht aufeinander abgestimmt, und es kann Fälle geben, in denen zwischen den beiden eine erhebliche zeitliche Lücke besteht.

Ich bin derzeit mit dieser (in Node.js, den nativen Treiber verwenden):

coll.find({ 'TimeIndex': 
       { 
        '$lt': new Date(startTime.getTime() + 1000*10), 
        '$gte': startTime 
       } 
      }); 

Aber gebacken dort ist die Annahme, dass es einen Punkt innerhalb von 10 Sekunden sein. Was ist, wenn es nicht ist? Dann muss ich eine Art erweiterter Suche durchführen?

Ich könnte die $ lt entfernen und nur das erste sortierte Ergebnis nehmen, aber dann befürchte ich, dass der Suchraum zu groß und es wird wirklich langsam werden.

Gibt es eine bessere Möglichkeit, dies zu tun, die ich vermisse?

+2

Wenn Sie nur ein Dokument suchen, können Sie findOne verwenden, anstatt das gewünschte Dokument nach der Eingabezeit zu finden. –

+1

Interessant, aber scheinbar findOne ist veraltet zugunsten von find(). Limit (1) –

+0

Yeah macht Sinn, findOne hört auf zu scannen, sobald es das erste Dokument bekommt, dasselbe was Limit 1 tut. Ich vermute. Obwohl ich nicht wusste, dass es veraltet ist. –

Antwort

0

Ich denke, Sie haben einen guten Ansatz hier, als Abfrage versucht, eine bestimmte Zeitlücke zu überwinden. Mit der Annahme, dass Feld einen Index haben, dann könnte ich vorschlagen, Zeitlücke zu sehr sicheren Puffer zu erweitern (und es hängt von der Datenlast) - wie 60 Sekunden.

Es könnte sogar besser sein, eine Menge übereinstimmender Dokumente abzurufen und sie clientseitig zu bearbeiten, als etwas zu verpassen und einen zusätzlichen Hin- und Rückweg zum Server zu haben.

0

Haben Sie so etwas probiert?

coll.find({ 'TimeIndex': {'$gte': startTime}}) 
    .sort({ TimeIndex: 1 }) 
    .limit(1); 

Ich weiß nicht über die Leistung jedoch.

Wenn es Leistungsproblem hat, sieht Ihr Ansatz gut aus.

Verwandte Themen