Domanda

Così ho un documento incorporato che tiene traccia le appartenenze ai gruppi. Ogni documento incorporato ha un ID che indica il gruppo in un'altra raccolta, una data di inizio e una opzionale scadenza data.

Voglio interrogare per i membri attuali di un gruppo. "Current" indica il tempo di inizio è inferiore al tempo corrente e il tempo di scadenza è maggiore del tempo o null corrente.

Questa query condizionale è totalmente mi bloccando in su. Potrei farlo eseguendo due query e la fusione dei risultati, ma che sembra brutto e richiede il caricamento di tutti i risultati in una sola volta. Oppure potrei difetto il tempo scade in una certa data arbitraria in un lontano futuro, ma che sembra ancora più brutto e potenzialmente fragili. In SQL avevo appena esprimo con "(scade> = Now ()) OR (scade IS NULL)." -, ma non so come fare a Mongo

Tutte le idee? Grazie mille in anticipo.

È stato utile?

Soluzione

Ho solo pensato di aggiornare in caso qualcuno si imbatte in questa pagina in futuro. A partire dal 1.5.3, Mongo supporta ora un vero e proprio $ o l'operatore: http : //www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or

Vostri criteri di "(scade> = Now ()) OR (scade IS NULL)" possono ora essere reso come:

{$or: [{expires: {$gte: new Date()}}, {expires: null}]}

Altri suggerimenti

Nel caso qualcuno ritiene utile, www.querymongo.com fa traduzione tra SQL e MongoDB, comprese clausole OR . Può essere molto utile per capire la sintassi quando si conosce l'equivalente SQL.

Nel caso di affermazioni o, sembra che questo

SQL:

SELECT * FROM collection WHERE columnA = 3 OR columnB = 'string';

MongoDB:

db.collection.find({
    "$or": [{
        "columnA": 3
    }, {
        "columnB": "string"
    }]
});

Query oggetti in Mongo per impostazione predefinita e le espressioni insieme. Mongo attualmente non include un operatore OR per tali query, tuttavia ci sono modi per esprimere tali domande.

Usa "in" o "dove".

La sua gonna essere qualcosa di simile:

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

);

Utilizzando una query $where sarà lenta, in parte perché non può utilizzare gli indici. Per questo tipo di problema, penso che sarebbe meglio per memorizzare un valore alto per il campo "scade", che sarà naturalmente sempre maggiore di Ora (). È possibile memorizzare un altissimo milioni di data di anni nel futuro, o utilizzare un tipo distinto per indicare mai. L'ordinamento trasversale tipo è definito in qui .

Un Regex vuoto o MaxKey (se il linguaggio supporta) sono entrambi buone scelte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top