Chciałbym uzyskać nazwy wszystkich kluczy w kolekcji MongoDB.
Na przykład z tego:
db.things.insert( { type : ['dog', 'cat'] } );
db.things.insert( { egg : ['cat'] } );
db.things.insert( { type : [] } );
db.things.insert( { hello : [] } );
Chciałbym zdobyć unikalne klucze:
type, egg, hello
for (var key in this.first_level.second_level.nth_level) { emit(key, null); }
db.runCommand({..., out: { "inline" : 1 }}).results.map(function(i) { return i._id; });
Z inspiracją Kristiny stworzyłem narzędzie typu open source o nazwie Variety, które robi dokładnie to: https://github.com/variety/variety
źródło
Można użyć agregacji z nowego
$objectToArrray
w3.4.4
wersji przekonwertować cały górny klawisz i parę wartości do tablic dokumentów następnie$unwind
&$group
z$addToSet
, aby uzyskać różne klucze na całej kolekcji.$$ROOT
do odwoływania się do dokumentu najwyższego poziomu.Możesz użyć poniższego zapytania, aby uzyskać klucze w jednym dokumencie.
źródło
.next()["allkeys"]
do polecenia (zakładając, że kolekcja zawiera co najmniej jeden element).Spróbuj tego:
źródło
Jeśli twoja kolekcja docelowa nie jest zbyt duża, możesz wypróbować to w kliencie powłoki mongo:
źródło
Oczyszczone i wielokrotnego użytku rozwiązanie za pomocą pymongo:
Stosowanie:
źródło
if (typeof(this[key]) == 'number')
Wcześniejemit(key, null)
.Używanie pytona. Zwraca zestaw wszystkich kluczy najwyższego poziomu w kolekcji:
źródło
Oto przykład działający w Pythonie: Ta próbka zwraca wyniki bezpośrednio w wierszu.
źródło
Jeśli używasz mongodb 3.4.4 i nowszych, możesz użyć poniżej agregacji za pomocą
$objectToArray
i$group
agregacjiOto działający przykład
źródło
$match
na początku potoku agregacji, aby uzyskać tylko klucze dokumentów spełniających warunki.Dziwię się, że nikt tutaj nie ma ans, używając prostej
javascript
iSet
logicznej metody automatycznego filtrowania duplikatów wartości, prosty przykład na powłoce mangowej, jak poniżej:Spowoduje to wydrukowanie wszystkich możliwych unikalnych kluczy w nazwie kolekcji : collectionName .
źródło
To działa dobrze dla mnie:
źródło
Myślę, że najlepszym sposobem, aby to zrobić, jak wspomniano tutaj, jest mongod 3.4.4+, ale bez użycia
$unwind
operatora i tylko dwóch etapów w przygotowaniu. Zamiast tego możemy użyć operatorów$mergeObjects
i$objectToArray
.Na
$group
etapie używamy$mergeObjects
operatora, aby zwrócić pojedynczy dokument, w którym klucz / wartość pochodzą ze wszystkich dokumentów w kolekcji.Potem przychodzi miejsce, w
$project
którym korzystamy$map
i zwracamy$objectToArray
klucze.Teraz, jeśli mamy zagnieżdżone dokumenty i chcemy również uzyskać klucze, jest to wykonalne. Dla uproszczenia rozważmy dokument z prostym osadzonym dokumentem, który wygląda następująco:
Poniższy potok daje wszystkie klucze (pole1, pole2, pole3, pole4).
Przy odrobinie wysiłku możemy uzyskać klucz do całego dokumentu podrzędnego w polu tablicy, w której elementy również są obiektami.
źródło
$unwind
, eksploduje kolekcję (liczba pól * liczba dokumentów), możemy tego uniknąć, używając$mergeObjects
wszystkich wersji>3.6
.. Czy to samo, Powinienem był zobaczyć tę odpowiedź wcześniej, moje życie byłoby łatwiejsze w ten sposób ( -_-)Może nieco nie na temat, ale możesz rekurencyjnie wydrukować wszystkie klucze / pola obiektu:
Przydatne, gdy wszystkie obiekty w kolekcji mają tę samą strukturę.
źródło
Aby uzyskać listę wszystkich kluczy minus
_id
, rozważ uruchomienie następującego potoku agregacji:źródło
Próbowałem pisać w nodejs i wreszcie wymyśliłem:
Po przeczytaniu nowo utworzonej kolekcji „allFieldNames” usuń ją.
źródło
Zgodnie z dokumentacją mongoldb , połączenie
distinct
a operacje zbierania indeksów zwracają wszystkie możliwe wartości dla danego klucza lub indeksu:
Tak więc w danej metodzie można użyć metody podobnej do następnej, w celu przeszukania kolekcji dla wszystkich zarejestrowanych indeksów i zwrócenia, powiedzmy obiektu z indeksami dla kluczy (w tym przykładzie użyto asynchronizacji / oczekiwania na NodeJS, ale oczywiście możesz użyć dowolnego innego podejścia asynchronicznego):
Zapytanie o kolekcję z
_id
indeksem podstawowym zwróciłoby następujące elementy (kolekcja testowa ma tylko jeden dokument w momencie testu):Pamiętaj, że używa to metod natywnych dla sterownika NodeJS. Jak sugerują niektóre inne odpowiedzi, istnieją inne podejścia, takie jak struktura zagregowana. Osobiście uważam to podejście za bardziej elastyczne, ponieważ można łatwo tworzyć i dostosowywać sposób zwracania wyników. Oczywiście dotyczy to tylko atrybutów najwyższego poziomu, a nie zagnieżdżonych. Ponadto, aby zagwarantować, że wszystkie dokumenty będą reprezentowane w przypadku indeksów wtórnych (innych niż główny _id), indeksy te należy ustawić jako
required
.źródło
Możemy to osiągnąć za pomocą pliku js mongo. Dodaj poniższy kod w swoim pliku getCollectionName.js i uruchom plik js w konsoli systemu Linux, jak podano poniżej:
Dzięki @ackuser
źródło
Podążając za wątkiem z odpowiedzi Jamesa Cropcho, wylądowałem na następujących, które okazały się bardzo łatwe w użyciu. Jest to narzędzie binarne, którego dokładnie szukałem: mongoeye .
Za pomocą tego narzędzia wyeksportowanie mojego schematu z wiersza polecenia zajęło około 2 minut.
źródło
Wiem, że to pytanie ma 10 lat, ale nie ma rozwiązania C # i zajęło mi to kilka godzin. Korzystam ze sterownika .NET i zwracam
System.Linq
listę kluczy.źródło
Rozbudowałem nieco rozwiązanie Carlosa LM, aby było bardziej szczegółowe.
Przykład schematu:
Wpisz w konsoli:
Biegać:
Wynik
źródło
Mam 1 prostsze obejście ...
To, co możesz zrobić, to wstawiając dane / dokument do głównej kolekcji „rzeczy”, musisz wstawić atrybuty do 1 osobnej kolekcji, powiedzmy „rzeczy_atrybuty”.
więc za każdym razem, gdy wstawiasz „rzeczy”, z „rzeczy_atrybuty” porównujesz wartości tego dokumentu z nowymi kluczami dokumentu, jeśli jakikolwiek nowy klucz dołącza go do tego dokumentu i ponownie wstawia.
Więc Things_attributes będzie mieć tylko 1 dokument unikatowych kluczy, które możesz łatwo uzyskać, kiedy tylko potrzebujesz za pomocą findOne ()
źródło