Vergleicht zwei Datum-Felder in MongoDB
in meiner Sammlung, jedes Dokument hat 2 Termine, geändert und synchronisiert. Ich möchte diejenigen, die geändert > sync oder sync ist nicht vorhanden.
Versuchte ich
{'modified': { $gt : 'sync' }}
aber es ist nicht das zeigt, was ich erwartet hatte. Irgendwelche Ideen?
Dank
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man nicht vergleichen ein Feld mit dem Wert eines anderen Feldes mit dem normalen query-matching. Jedoch, Sie können dies tun, mit dem aggregation framework:
Lege ich ...deine normale andere Abfrage... da können Sie machen, dass ein bit den index verwenden. Also, wenn Sie wollen, tun Sie dies nur für Dokumente, in denen die
name
Feld istcharles
Sie tun können:Mit der Eingabe:
Zurück:
Wenn Sie wollen mehr Felder, die Sie benötigen, fügen Sie Sie in die
$project
.$where
Variante aber, wie es geht über Javascript. Auch, bitte akzeptieren Sie die Antwort.Einfach
Beispiel
Für MongoDB 3.6 und neuer:
Den
$expr
- operator ermöglicht die Verwendung von aggregation Ausdrücke in der Abfrage-Sprache, so können Sie Folgendes tun:oder mit aggregation-framework mit
$match
pipelineFür MongoDB 3.0+:
Können Sie auch mit dem aggregation-framework mit der
$schwärzen
pipeline-Betreiber, die Ihnen erlaubt, Prozess der logische Zustand mit der$dir
operator, und verwendet die spezielle Operationen$$BEHALTEN
zu "halten" das Dokument, in dem die logische Bedingung wahr ist oder$$PRUNE
zu "entfernen" das Dokument, in dem die Bedingung war falsch.Betrachten Sie zum ausführen der folgenden Aggregat-Betrieb zeigt das obige Konzept:
Dieser Vorgang ist ähnlich wie mit einem
$project
pipeline, wählt die Felder in der Sammlung und erstellt ein neues Feld, das hält das Ergebnis der logischen Bedingung Abfragen und dann einen anschließenden$match
, außer dass$schwärzen
verwendet eine einzige pipeline-Stufe, die ist effizienter:Javascript verwenden, verwenden Sie foreach Und convert Date Zu toDateString()
Nun Ihre Abfrage versucht, alle Ergebnisse zurückgegeben werden, so dass die
modified
Feld ist größer als das Wort'sync'
. Versuchen Sie, loszuwerden, die Anführungszeichen umsync
und sehen, ob das behebt alles. Ansonsten, ich habe ein wenig Forschung und fand diese Frage. Was Sie zu tun versuchen, nur vielleicht nicht möglich sein, in einer einzigen Abfrage, aber Sie sollten in der Lage zu Bearbeiten Sie Ihre Daten, sobald Sie ziehen alles aus der Datenbank.Um dieses Problem zu beheben, ohne aggregation ändern Sie Ihre Abfrage so:
{'modified': { $gt : ISODate(this.sync) }}