sql >> Base de Datos >  >> NoSQL >> MongoDB

Cómo devolver documentos donde dos campos tienen el mismo valor

Tienes dos opciones aquí. El primero es usar el $where operador.

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

La segunda opción es usar el marco de agregación y el $redact operador.

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

El $where El operador realiza una evaluación de JavaScript y no puede aprovechar los índices, por lo que consulta usando $where puede causar una caída en el rendimiento de su aplicación. Consulte considerations . Si usa $where, cada uno de sus documentos se convertirá de BSON a objeto JavaScript antes de la operación $where, lo que provocará una caída del rendimiento. Por supuesto, su consulta se puede mejorar si tiene un filtro de índice. También existe un riesgo de seguridad si está creando su consulta dinámicamente en función de la entrada del usuario.

El $redact como el $where no usa índices e incluso realiza un escaneo de colección, pero el rendimiento de su consulta mejora cuando $redact porque es un operador estándar de MongoDB. Dicho esto, la opción de agregación es mucho mejor porque siempre puede filtrar su documento usando el operador $match.

$where aquí está bien, pero podría evitarse. También creo que solo necesitas $where cuando tiene un problema de diseño de esquema. Por ejemplo, agregar otro campo booleano al documento con índice puede ser una buena opción aquí.