MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

So geben Sie Dokumente zurück, bei denen zwei Felder den gleichen Wert haben

Sie haben hier zwei Möglichkeiten. Die erste ist die Verwendung von $where Betreiber.

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

Die zweite Option besteht darin, das Aggregationsframework und den $redact Betreiber.

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

Das $where -Operator führt eine JavaScript-Evaluierung durch und kann Indexe nicht nutzen, also fragen Sie mit $where ab kann zu einem Leistungsabfall in Ihrer Anwendung führen. Siehe Überlegungen . Wenn Sie $where verwenden, wird jedes Ihrer Dokumente vor der $where-Operation von BSON in ein JavaScript-Objekt konvertiert, was zu einem Leistungsabfall führt. Natürlich kann Ihre Abfrage verbessert werden, wenn Sie einen Indexfilter haben. Außerdem besteht ein Sicherheitsrisiko, wenn Sie Ihre Abfrage dynamisch basierend auf Benutzereingaben erstellen.

Der $redact wie $where verwendet keine Indizes und führt sogar einen Sammlungsscan durch, aber Ihre Abfrageleistung verbessert sich, wenn Sie $redact ausführen weil es sich um einen Standard-MongoDB-Operator handelt. Davon abgesehen ist die Aggregationsoption weitaus besser, da Sie Ihr Dokument immer mit dem $match-Operator filtern können.

$where hier ist in Ordnung, könnte aber vermieden werden. Ich glaube auch, dass Sie nur $where brauchen wenn Sie ein Schemaentwurfsproblem haben. Hier kann beispielsweise das Hinzufügen eines weiteren booleschen Felds zum Dokument mit Index eine gute Option sein.