requête MongoDB avec une condition « ou »
-
18-09-2019 - |
Question
J'ai un document intégré qui suit les adhésions du groupe. Chaque document incorporé a une carte d'identité indiquant le groupe dans une autre collection, une date de début et une option date de fin.
Je veux interroger les membres actuels d'un groupe. « Courant » l'heure de départ est inférieure à l'heure actuelle, et la expireront temps est supérieure à l'heure actuelle ou nulle.
Cette requête conditionnelle est tout à fait me bloque vers le haut. Je pouvais le faire en exécutant deux requêtes et la fusion des résultats, mais qui semble laid et nécessite le chargement dans tous les résultats à la fois. Ou je pourrais défaut la expireront le temps d'une date arbitraire dans un avenir lointain, mais qui semble encore plus laid et potentiellement fragile. Dans SQL que je venais d'exprimer avec « (expire> = maintenant ()) OR (expiration IS NULL). » - mais je ne sais pas comment faire dans Mongo
Toutes les idées? Merci beaucoup à l'avance.
La solution
Je pensais juste que je mettre à jour tout le monde en cas tombe par hasard sur cette page à l'avenir. À partir de 1.5.3, mongo soutient maintenant un vrai $ ou opérateur: http : //www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24or
Votre requête de "(expire> = maintenant ()) OR (expiration IS NULL)" peut maintenant être rendu comme:
{$or: [{expires: {$gte: new Date()}}, {expires: null}]}
Autres conseils
Dans le cas où quelqu'un trouve utile, www.querymongo.com fait la traduction entre SQL et MongoDB, y compris les clauses OU . Il peut être très utile pour déterminer la syntaxe quand vous connaissez l'équivalent SQL.
Dans le cas des déclarations OU, il ressemble à ceci
SQL:
SELECT * FROM collection WHERE columnA = 3 OR columnB = 'string';
MongoDB:
db.collection.find({
"$or": [{
"columnA": 3
}, {
"columnB": "string"
}]
});
Utilisez "dans" ou "où".
Sa va être quelque chose comme ceci:
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"
}]
}
);
En utilisant une requête $where
sera lente, en partie parce qu'il ne peut pas utiliser les index. Pour ce genre de problème, je pense qu'il serait préférable de stocker une valeur élevée pour le « expire » champ qui sera plus grande que naturellement toujours maintenant (). Vous pouvez stocker une date très élevé des millions d'années dans le futur, ou utiliser un type distinct pour indiquer jamais. L'ordre de tri de type croix est défini à ici .
Un Regex vide ou MaxKey (si vous la langue inclus) sont les deux bons choix.