J'aimerais obtenir les noms de toutes les clés d'une collection MongoDB.
Par exemple, à partir de ceci:
db.things.insert( { type : ['dog', 'cat'] } );
db.things.insert( { egg : ['cat'] } );
db.things.insert( { type : [] } );
db.things.insert( { hello : [] } );
J'aimerais obtenir les clés uniques:
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; });
Avec la réponse de Kristina comme source d'inspiration, j'ai créé un outil open source appelé Variety qui fait exactement cela: https://github.com/variety/variety
la source
Vous pouvez utiliser l' agrégation avec une nouvelle
$objectToArrray
dans la3.4.4
version pour convertir toutes les clés en haut et la paire de valeurs dans des tableaux de documents , suivi par$unwind
et$group
avec$addToSet
pour obtenir les clés distinctes de collection.$$ROOT
pour référencer le document de niveau supérieur.Vous pouvez utiliser la requête ci-dessous pour obtenir des clés dans un seul document.
la source
.next()["allkeys"]
à la commande (en supposant que la collection a au moins un élément).Essaye ça:
la source
Si votre collection cible n'est pas trop grande, vous pouvez essayer ceci sous le client shell mongo:
la source
Une solution nettoyée et réutilisable avec pymongo:
Usage:
la source
if (typeof(this[key]) == 'number')
avantemit(key, null)
.Utilisation de python. Renvoie l'ensemble de toutes les clés de niveau supérieur de la collection:
la source
Voici l'exemple travaillé en Python: Cet exemple renvoie les résultats en ligne.
la source
Si vous utilisez mongodb 3.4.4 et supérieur, vous pouvez utiliser l'agrégation ci-dessous en utilisant
$objectToArray
et l'$group
agrégationVoici l' exemple de travail
la source
$match
au début du pipeline d'agrégation pour obtenir uniquement les clés des documents qui correspondent à une ou plusieurs conditions.Je suis surpris, personne ici n'a ans en utilisant simple
javascript
etSet
logique pour filtrer automatiquement les valeurs en double, exemple simple sur shell mongo comme ci-dessous:Cela imprimera toutes les clés uniques possibles dans le nom de la collection: collectionName .
la source
Cela fonctionne bien pour moi:
la source
Je pense que la meilleure façon de le faire comme mentionné ici est dans mongod 3.4.4+ mais sans utiliser l'
$unwind
opérateur et en utilisant seulement deux étapes dans le pipeline. Au lieu de cela, nous pouvons utiliser les opérateurs$mergeObjects
et$objectToArray
.À l'
$group
étape, nous utilisons l'$mergeObjects
opérateur pour renvoyer un seul document dont la clé / valeur provient de tous les documents de la collection.Vient ensuite le
$project
lieu d'utilisation$map
et$objectToArray
le retour des clés.Maintenant, si nous avons des documents imbriqués et que nous voulons également obtenir les clés, c'est faisable. Pour plus de simplicité, considérons un document avec un document incorporé simple qui ressemble à ceci:
Le pipeline suivant fournit toutes les clés (champ1, champ2, champ3, champ4).
Avec un petit effort, nous pouvons obtenir la clé de tous les sous-documents dans un champ tableau où les éléments sont également des objets.
la source
$unwind
va exploser la collection (no.of fields * no.of docs), nous pouvons éviter cela en utilisant$mergeObjects
sur toutes les versions>3.6
.. A fait la même chose, J'aurais dû voir cette réponse avant, ma vie aurait été plus facile de cette façon ( -_-)Peut-être légèrement hors sujet, mais vous pouvez imprimer de manière récursive toutes les clés / champs d'un objet:
Utile lorsque tous les objets d'une collection ont la même structure.
la source
Pour obtenir une liste de toutes les clés moins
_id
, envisagez d'exécuter le pipeline d'agrégation suivant:la source
J'essayais d'écrire dans nodejs et j'ai finalement trouvé ceci:
Après avoir lu la collection nouvellement créée "allFieldNames", supprimez-la.
la source
Selon la documentation de mongoldb , une combinaison de
distinct
et les opérations de collecte d' index sont ce qui retournerait toutes les valeurs possibles pour une clé ou un index donné:
Donc, dans une méthode donnée, on pourrait utiliser une méthode comme la suivante, afin d'interroger une collection pour tous ses index enregistrés, et retourner, par exemple, un objet avec les index pour les clés (cet exemple utilise async / wait pour NodeJS, mais vous pouvez évidemment utiliser toute autre approche asynchrone):
Donc, interroger une collection avec l'
_id
index de base , retournerait ce qui suit (la collection de test n'a qu'un seul document au moment du test):Attention, cela utilise des méthodes natives du pilote NodeJS. Comme certaines autres réponses l'ont suggéré, il existe d'autres approches, comme le cadre global. Personnellement, je trouve cette approche plus flexible, car vous pouvez facilement créer et affiner comment renvoyer les résultats. De toute évidence, cela ne concerne que les attributs de niveau supérieur, pas ceux imbriqués. De plus, pour garantir que tous les documents sont représentés s'il existe des index secondaires (autres que le _id principal), ces index doivent être définis comme
required
.la source
Nous pouvons y parvenir en utilisant le fichier mongo js. Ajoutez le code ci-dessous dans votre fichier getCollectionName.js et exécutez le fichier js dans la console de Linux comme indiqué ci-dessous:
Merci @ackuser
la source
En suivant le fil de la réponse de @James Cropcho, j'ai atterri sur les éléments suivants que j'ai trouvé très faciles à utiliser. C'est un outil binaire, c'est exactement ce que je cherchais: mongoeye .
En utilisant cet outil, il a fallu environ 2 minutes pour exporter mon schéma à partir de la ligne de commande.
la source
Je sais que cette question a 10 ans mais il n'y a pas de solution C # et cela m'a pris des heures à comprendre. J'utilise le pilote .NET et
System.Linq
pour retourner une liste des clés.la source
J'ai un peu étendu la solution de Carlos LM pour qu'elle soit plus détaillée.
Exemple de schéma:
Tapez dans la console:
Courir:
Production
la source
J'ai 1 travail plus simple à faire ...
Ce que vous pouvez faire, c'est qu'en insérant des données / documents dans votre collection principale «choses», vous devez insérer les attributs dans 1 collection distincte, disons «choses_attributs».
Ainsi, chaque fois que vous insérez dans "Things", vous obtenez de "Things_attributes" comparez les valeurs de ce document avec vos nouvelles clés de document si une nouvelle clé présente l'ajoute dans ce document et le réinsère à nouveau.
Donc Things_attributes n'aura qu'un seul document de clés uniques que vous pouvez facilement obtenir quand vous en avez besoin en utilisant findOne ()
la source