MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment renvoyer des documents où deux champs ont la même valeur

Vous avez deux options ici. La première consiste à utiliser le $where opérateur.

Collection.find( { $where: "this.start === this.end" } )

La deuxième option consiste à utiliser le cadre d'agrégation et le $redact opérateur.

Collection.aggregate([
    { "$redact": { 
        "$cond": [
            { "$eq": [ "$start", "$end" ] },
            "$$KEEP",
            "$$PRUNE"
        ]
    }}
])

Le $where l'opérateur fait une évaluation JavaScript et ne peut pas tirer parti des index, donc interrogez en utilisant $where peut entraîner une baisse des performances de votre application. Voir considérations . Si vous utilisez $where, chacun de vos documents sera converti de BSON en objet JavaScript avant l'opération $where, ce qui entraînera une baisse des performances. Bien sûr, votre requête peut être améliorée si vous avez un filtre d'index. Il existe également un risque de sécurité si vous créez votre requête de manière dynamique en fonction des entrées de l'utilisateur.

Le $redact comme le $where n'utilise pas d'index et n'effectue même pas d'analyse de collection, mais les performances de votre requête s'améliorent lorsque vous $redact car il s'agit d'un opérateur MongoDB standard. Cela étant dit, l'option d'agrégation est bien meilleure car vous pouvez toujours filtrer votre document à l'aide de l'opérateur $match.

$where ici c'est bien mais pourrait être évité. Aussi, je crois que vous n'avez besoin que de $where lorsque vous avez un problème de conception de schéma. Par exemple, ajouter un autre champ booléen au document avec index peut être une bonne option ici.