MongoDB Abfrage mit einer ‚oder‘ Bedingung
-
18-09-2019 - |
Frage
So habe ich ein eingebettetes Dokument, das Gruppenmitgliedschaft verfolgt. Jedes eingebettetes Dokument hat eine ID zeigt auf die Gruppe in einer anderen Sammlung, ein Startdatum und ein optional Ablaufdatum.
Ich möchte für aktuelle Mitglieder einer Gruppe abzufragen. „Current“ bedeutet, dass die Startzeit ist kleiner als die aktuelle Zeit und die Ablaufzeit größer ist als die aktuelle Zeit oder null.
Diese bedingte Abfrage völlig blockiert mich. Ich kann es tun, indem zwei Abfragen ausgeführt und die Ergebnisse Zusammenführung, aber das scheint hässlich und erfordert Laden in allen sofort Ergebnissen. Oder ich könnte standardmäßig die Zeit bis zu einem gewissen willkürlichen Zeitpunkt in der fernen Zukunft ablaufen, aber das scheint noch hässliches und möglicherweise brüchig. In SQL würde ich ausdrücken es nur mit "(gültig bis> = Now ()) OR (gültig bis IS NULL)." - aber ich weiß nicht, wie in Mongo, das zu tun
Irgendwelche Ideen? Vielen Dank im Voraus.
Lösung
dachte, ich würde aktualisieren im Fall, dass jemand auf dieser Seite in Zukunft stolpert. Ab 1.5.3, Mongo unterstützt jetzt ein echter $ oder Betreiber: http : //www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or
Ihre Abfrage von "(gültig bis> = Now ()) OR (gültig bis IS NULL)" kann nun wiedergegeben werden als:
{$or: [{expires: {$gte: new Date()}}, {expires: null}]}
Andere Tipps
Falls sich jemand findet es nützlich, www.querymongo.com tut Übersetzung zwischen SQL und MongoDB, einschließlich OR-Klauseln . Es kann für herauszufinden Syntax wirklich hilfreich sein, wenn Sie die SQL-Äquivalent kennen.
Im Falle von OR-Anweisungen, es sieht wie folgt aus
SQL:
SELECT * FROM collection WHERE columnA = 3 OR columnB = 'string';
MongoDB:
db.collection.find({
"$or": [{
"columnA": 3
}, {
"columnB": "string"
}]
});
Verwenden Sie "in" oder "where".
Sein Gehen so etwas wie diese:
db.mycollection.find( { $where : function() {
return ( this.startTime < Now() && this.expireTime > Now() || this.expireTime == null ); } } );
db.Lead.find (
{"name": {'$regex' : '.*' + "Ravi" + '.*'}},
{
"$or": [{
'added_by':"arunkrishna@aarux.com"
}, {
'added_by':"aruna@aarux.com"
}]
}
);
eine $where
Abfrage wird teilweise langsam, sein, weil es keine Indizes verwenden können. Für diese Art von Problem, ich denke, es wäre besser, einen hohen Wert zu speichern, für das „gültig bis“ Feld, das als jetzt natürlich immer größer sein wird (). Sie können entweder speichern eine sehr hohe Datum Millionen Jahre in der Zukunft, oder eine separate Art nie, um anzuzeigen, zu verwenden. Die Quer Typ Sortierreihenfolge wird unter hier .
Eine leere Regex oder MaxKey (wenn Sie die Sprache unterstützt) sind beide eine gute Wahl.