Czy istnieje zapytanie do obliczenia, ile różnych wartości zawiera pole w bazie danych?
fe mam pole dla kraju i jest 8 typów wartości kraju (Hiszpania, Anglia, Francja itd.)
Jeśli ktoś doda więcej dokumentów z nowym krajem to chciałbym, żeby zapytanie zwróciło 9.
Czy jest łatwiejszy sposób niż grupowanie i liczenie?
Odpowiedzi:
MongoDB zawiera
distinct
polecenie, które zwraca tablicę odrębnych wartości dla pola; możesz sprawdzić długość tablicy pod kątem liczby.Jest też
db.collection.distinct()
pomocnik powłoki :źródło
Oto przykład użycia interfejsu API agregacji. Aby skomplikować sprawę, grupujemy według słów niewrażliwych na wielkość liter z właściwości tablicy dokumentu.
które dają wynik taki jak
źródło
unwind
jest konieczne, ponieważ kod grupuje poszczególne wartości pola tablicy, które odpowiada temu, jakdistinct
działa.unwind
jest niezbędne podczas pracy z tablicami.Dzięki MongoDb 3.4.4 i nowszym możesz wykorzystać
$arrayToObject
operatora i$replaceRoot
potok, aby uzyskać liczby.Na przykład załóżmy, że masz kolekcję użytkowników z różnymi rolami i chcesz obliczyć różne liczby ról. Musisz uruchomić następujący potok zagregowany:
Przykładowe dane wyjściowe
źródło
.distinct()
.Możesz skorzystać z rozszerzeń powłoki Mongo . Jest to pojedynczy import .js, który możesz dołączyć do swojego
$HOME/.mongorc.js
lub programowo, jeśli kodujesz również w Node.js / io.js.Próba
Dla każdej odrębnej wartości pola zlicza wystąpienia w dokumentach opcjonalnie filtrowane według zapytania
Parametr pola może być tablicą pól
źródło
require("./script.js")
, przypuszczam.mongorc.js
plik w katalogu domowym. Gotowe.Aby znaleźć
field_1
coś innego w kolekcji, ale chcemy też mieć jakiśWHERE
warunek, niż możemy zrobić, jak poniżej:db.your_collection_name.distinct('field_1', {WHERE condition here and it should return a document})
Więc znajdź liczbę inną
names
niż zbiór, w której wiek> 25 lat będzie wyglądał następująco:db.your_collection_name.distinct('names', {'age': {"$gt": 25}})
Mam nadzieję, że to pomoże!
źródło