2013-08-20 3 views
5

Ich habe eine Sammlung in MongoDB mit zwei Datumsangaben, die festlegen, ob etwas aktuell ist oder nicht. Also habe ich ein "end_date", das null sein kann oder einen Zeitwert haben kann. Ein Element, für das current ein Null-Enddatum oder eine Uhrzeit in der Zukunft hat. Meine Abfrage sieht so aus:MongoDB - finde das Ergebnis, wenn der Wert null oder kleiner als X ist

program_enrollments.find({"start_date":{"$lte":1376982000},"end_date":[null,{"$gte ":1376982000}],"client":"52002d02cc94a31a0f000000"}, []) 

Das sieht für mich richtig aus, aber brauche ich einen anderen Ansatz? Ich möchte kein boolesches Flag haben, das angibt, ob die Daten aktuell sind oder nicht, wenn ich es vermeiden kann.

Antwort

9

Sie suchen nach der $or-Operation, die eine Reihe von Operationen akzeptiert. Es wäre etwa so sein:

$or: [{end_date: null}, {end_date: {$gte: 1376982000}}] 

Ihre gesamte Abfrage würde wie folgt aussehen:

program_enrollments.find({ 
    start_date: {$lte: 1376982000}, 
    $or: [ 
    {end_date: null}, 
    {end_date: {$gte: 1376982000}} 
    ], 
    client:"52002d02cc94a31a0f000000" 
}) 

zu skalieren, werden Sie einen Weg finden, zu entfernen, entweder die $gte und $lte Betreiber. MongoDB kann die Kombination der $lte und $gte auf verschiedenen Attributen in der Abfrage nicht verwenden.

0

Statt {end_date: null} können Sie fragen, ob die Variable {end_data: {$exists: false}} existiert. Beachten Sie, dass, wenn end_date in dem Dokument mit null Wert ist, dann wird zuerst einer arbeiten und zweitens nicht.

+1

'{end_date: null}' deckte auch den Eckfall ab, in dem das Feld einfach wegen Unterlassung nicht vorhanden war, {end_data: {$ exists: false}} 'nicht ... zumindest nicht wenn ich getestet mit v3.0 – pulkitsinghal

Verwandte Themen