Ich möchte die Namen aller Schlüssel in einer MongoDB-Sammlung erhalten.
Zum Beispiel daraus:
db.things.insert( { type : ['dog', 'cat'] } );
db.things.insert( { egg : ['cat'] } );
db.things.insert( { type : [] } );
db.things.insert( { hello : [] } );
Ich möchte die eindeutigen Schlüssel erhalten:
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; });
Mit Kristinas Antwort als Inspiration habe ich ein Open-Source-Tool namens Variety erstellt, das genau dies tut: https://github.com/variety/variety
quelle
Sie können die Aggregation mit neuer Verwendung
$objectToArrray
in3.4.4
Version alle Top-Schlüssel und Wert - Paar in Dokument - Arrays von gefolgt zu konvertieren$unwind
und$group
mit$addToSet
verschiedenen Schlüssel über die gesamte Sammlung zu erhalten.$$ROOT
zum Verweisen auf das Dokument der obersten Ebene.Sie können die folgende Abfrage verwenden, um Schlüssel in einem einzelnen Dokument abzurufen.
quelle
.next()["allkeys"]
an den Befehl anhängen (vorausgesetzt, die Sammlung enthält mindestens ein Element).Versuche dies:
quelle
Wenn Ihre Zielsammlung nicht zu groß ist, können Sie dies unter Mongo Shell Client versuchen:
quelle
Eine gereinigte und wiederverwendbare Lösung mit Pymongo:
Verwendungszweck:
quelle
if (typeof(this[key]) == 'number')
vorher hinzuemit(key, null)
.Python verwenden. Gibt den Satz aller Schlüssel der obersten Ebene in der Sammlung zurück:
quelle
Hier ist das in Python bearbeitete Beispiel: Dieses Beispiel gibt die Ergebnisse inline zurück.
quelle
Wenn Sie Mongodb 3.4.4 und höher verwenden, können Sie die folgende Aggregation mit
$objectToArray
und$group
Aggregation verwendenHier ist das Arbeitsbeispiel
quelle
$match
am Anfang der Aggregationspipeline verwenden, um nur die Schlüssel von Dokumenten abzurufen, die einer Bedingung entsprechen.Ich bin überrascht, dass hier niemand eine Antwort hat, indem er einfach
javascript
undSet
logisch die doppelten Werte automatisch filtert. Ein einfaches Beispiel für die Mongo-Shell ist wie folgt:Dadurch werden alle möglichen eindeutigen Schlüssel im Sammlungsnamen gedruckt : collectionName .
quelle
Das funktioniert gut für mich:
quelle
Ich denke, der beste Weg, dies wie hier erwähnt zu tun , ist in Mongod 3.4.4+, aber ohne den
$unwind
Operator zu verwenden und nur zwei Stufen in der Pipeline zu verwenden. Stattdessen können wir die Operatoren$mergeObjects
und verwenden$objectToArray
.In der
$group
Phase verwenden wir den$mergeObjects
Operator, um ein einzelnes Dokument zurückzugeben, bei dem Schlüssel / Wert aus allen Dokumenten in der Sammlung stammen.Dann kommt der Ort, an
$project
dem wir die Schlüssel verwenden$map
und$objectToArray
zurückgeben.Wenn wir nun verschachtelte Dokumente haben und auch die Schlüssel erhalten möchten, ist dies machbar. Betrachten Sie der Einfachheit halber ein Dokument mit einem einfachen eingebetteten Dokument, das folgendermaßen aussieht:
Die folgende Pipeline liefert alle Schlüssel (Feld1, Feld2, Feld3, Feld4).
Mit ein wenig Aufwand können wir den Schlüssel für alle Unterdokumente in einem Array-Feld abrufen, in dem die Elemente ebenfalls Objekte sind.
quelle
$unwind
wird die Sammlung explodieren lassen (Anzahl der Felder * Anzahl der Dokumente). Wir können dies vermeiden, indem wir sie$mergeObjects
für alle Versionen verwenden3.6
. -_-)Möglicherweise etwas außerhalb des Themas, aber Sie können alle Schlüssel / Felder eines Objekts rekursiv hübsch drucken:
Nützlich, wenn alle Objekte in einer Sammlung dieselbe Struktur haben.
quelle
Um eine Liste aller Schlüssel minus zu erhalten
_id
, sollten Sie die folgende aggregierte Pipeline ausführen:quelle
Ich habe versucht, in nodejs zu schreiben und habe mir schließlich Folgendes ausgedacht:
Löschen Sie die neu erstellte Sammlung "allFieldNames", nachdem Sie sie gelesen haben.
quelle
Gemäß der Mongoldb- Dokumentation ist eine Kombination aus
distinct
und Indexerfassungsoperationen geben alle möglichen Werte für einen bestimmten Schlüssel oder Index zurück:
In einer bestimmten Methode könnte man also eine Methode wie die folgende verwenden, um eine Sammlung nach allen registrierten Indizes abzufragen und beispielsweise ein Objekt mit den Indizes für Schlüssel zurückzugeben (in diesem Beispiel wird async / await für NodeJS verwendet, aber Natürlich können Sie auch einen anderen asynchronen Ansatz verwenden.
Wenn Sie also eine Sammlung mit dem Basisindex abfragen
_id
, wird Folgendes zurückgegeben (die Testsammlung enthält zum Zeitpunkt des Tests nur ein Dokument):Allerdings werden hierfür Methoden verwendet, die dem NodeJS-Treiber eigen sind. Wie einige andere Antworten vorgeschlagen haben, gibt es andere Ansätze, wie beispielsweise das aggregierte Framework. Ich persönlich finde diesen Ansatz flexibler, da Sie auf einfache Weise erstellen und optimieren können, wie die Ergebnisse zurückgegeben werden sollen. Dies betrifft natürlich nur Attribute der obersten Ebene, keine verschachtelten. Um sicherzustellen, dass alle Dokumente dargestellt werden, falls es Sekundärindizes gibt (außer dem Haupt-ID), sollten diese Indizes wie folgt festgelegt werden
required
.quelle
Wir können dies erreichen, indem wir die mongo js-Datei verwenden. Fügen Sie den folgenden Code in Ihre getCollectionName.js- Datei ein und führen Sie die js-Datei in der Linux-Konsole wie folgt aus:
Danke @ackuser
quelle
Nach dem Thread aus der Antwort von @James Cropcho bin ich auf Folgendes gestoßen, das ich als super einfach zu bedienen empfand. Es ist ein binäres Werkzeug, genau das, wonach ich gesucht habe: Mongoeye .
Mit diesem Tool dauerte es ungefähr 2 Minuten, bis mein Schema von der Befehlszeile exportiert wurde.
quelle
Ich weiß, dass diese Frage 10 Jahre alt ist, aber es gibt keine C # -Lösung, und ich habe Stunden gebraucht, um das herauszufinden. Ich verwende den .NET-Treiber und
System.Linq
gebe eine Liste der Schlüssel zurück.quelle
Ich habe die Lösung von Carlos LM etwas erweitert, damit sie detaillierter ist.
Beispiel eines Schemas:
Geben Sie in die Konsole ein:
Lauf:
Ausgabe
quelle
Ich habe 1 einfachere Arbeit zu umgehen ...
Was Sie tun können, ist, während Sie Daten / Dokumente in Ihre Hauptsammlung "Dinge" einfügen. Sie müssen die Attribute in eine separate Sammlung einfügen, sagen wir "Dinge_Attribute".
Jedes Mal, wenn Sie in "things" einfügen, erhalten Sie von "things_attributes" einen Vergleich der Werte dieses Dokuments mit Ihren neuen Dokumentschlüsseln, wenn ein neuer vorhandener Schlüssel ihn in dieses Dokument anfügt und erneut einfügt.
Things_attributes verfügt also nur über 1 Dokument mit eindeutigen Schlüsseln, die Sie mithilfe von findOne () jederzeit problemlos abrufen können.
quelle