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.

War es hilfreich?

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"
    }]
});

Query-Objekte Mongo von Ausfall- und Ausdrücke zusammen. Mongo momentan nicht ein OR-Operator für solche Abfragen enthalten, aber es gibt Möglichkeiten, um solche Abfragen auszudrücken.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top