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.

Était-ce utile?

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

objets de requête à Mongo par défaut et des expressions ensemble. Mongo ne comprend pas actuellement un opérateur OR pour de telles requêtes, mais il existe des moyens d'exprimer de telles requêtes.

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top