MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak zwrócić dokumenty, w których dwa pola mają tę samą wartość?

Masz tutaj dwie opcje. Pierwszym z nich jest użycie $where operatora.

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

Drugą opcją jest użycie struktury agregacji i $redact operatora.

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

$where operator wykonuje ocenę JavaScript i nie może korzystać z indeksów, więc zapytanie za pomocą $where może spowodować spadek wydajności aplikacji. Zobacz rozważania . Jeśli użyjesz $where, każdy Twój dokument zostanie przekonwertowany z obiektu BSON na obiekt JavaScript przed operacją $where, co spowoduje spadek wydajności. Oczywiście zapytanie można poprawić, jeśli masz filtr indeksu. Istnieje również zagrożenie bezpieczeństwa, jeśli tworzysz zapytanie dynamicznie w oparciu o dane wprowadzone przez użytkownika.

$redact jak $where nie używa indeksów, a nawet wykonuje skanowanie kolekcji, ale wydajność zapytania poprawia się, gdy $redact ponieważ są to standardowe operatory MongoDB. Biorąc to pod uwagę, opcja agregacji jest znacznie lepsza, ponieważ zawsze możesz filtrować swój dokument za pomocą operatora $match.

$where tutaj jest w porządku, ale można tego uniknąć. Uważam też, że potrzebujesz tylko $where gdy masz problem z projektowaniem schematu. Na przykład dodanie kolejnego pola logicznego do dokumentu z indeksem może być tutaj dobrą opcją.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Agregacja GroupBy, w tym brakujące daty w mongo

  2. Sortowanie agregacji MongoDB nie działa

  3. Muszę pobrać obiekt MongoDB tylko za pomocą filtrowanego elementu tablicy

  4. Mongoose findOneAndUpdate i runValidators nie działają

  5. MongoDB z wyjątkiem java w głównym wątku java.lang.NoClassDefFoundError:org/bson/conversions/Bson