MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como devolver documentos onde dois campos têm o mesmo valor


Você tem duas opções aqui. A primeira é usar o $where operador.
Collection.find( { $where: "this.start === this.end" } )

A segunda opção é usar a estrutura de agregação e o $redact operador.
Collection.aggregate([
    { "$redact": { 
        "$cond": [
            { "$eq": [ "$start", "$end" ] },
            "$$KEEP",
            "$$PRUNE"
        ]
    }}
])

O $where operador faz uma avaliação JavaScript e não pode tirar proveito dos índices, então consulte usando $where pode causar uma queda de desempenho em seu aplicativo. Consulte considerações . Se você usar $where, cada um de seus documentos será convertido de BSON para objeto JavaScript antes da operação $where, o que causará uma queda de desempenho. Claro que sua consulta pode ser melhorada se você tiver um filtro de índice. Além disso, há risco de segurança se você estiver construindo sua consulta dinamicamente com base na entrada do usuário.

O $redact como o $where não usa índices e nem mesmo executa uma varredura de coleção, mas o desempenho de sua consulta melhora quando você $redact porque é um operador padrão do MongoDB. Dito isto, a opção de agregação é muito melhor porque você sempre pode filtrar seu documento usando o operador $match.

$where aqui é bom, mas poderia ser evitado. Também acredito que você só precisa de $where quando você tem um problema de design de esquema. Por exemplo, adicionar outro campo booleano ao documento com índice pode ser uma boa opção aqui.