Me gustaría obtener los nombres de todas las claves en una colección MongoDB.
Por ejemplo, de esto:
db.things.insert( { type : ['dog', 'cat'] } );
db.things.insert( { egg : ['cat'] } );
db.things.insert( { type : [] } );
db.things.insert( { hello : [] } );
Me gustaría obtener las claves únicas:
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; });
Con la respuesta de Kristina como inspiración, creé una herramienta de código abierto llamada Variety que hace exactamente esto: https://github.com/variety/variety
fuente
Puede utilizar la agregación con el nuevo
$objectToArrray
en3.4.4
la versión para convertir todo tecla superior y par de valores en matrices de documentos seguidos por$unwind
y$group
con los$addToSet
que obtener las claves distintas a través de toda la colección.$$ROOT
para hacer referencia al documento de nivel superior.Puede usar la consulta a continuación para obtener claves en un solo documento.
fuente
.next()["allkeys"]
el comando (suponiendo que la colección tenga al menos un elemento).Prueba esto:
fuente
Si su colección de destino no es demasiado grande, puede probar esto en el cliente de shell mongo:
fuente
Una solución limpia y reutilizable usando pymongo:
Uso:
fuente
if (typeof(this[key]) == 'number')
antesemit(key, null)
.Usando python. Devuelve el conjunto de todas las claves de nivel superior de la colección:
fuente
Aquí está la muestra trabajada en Python: esta muestra devuelve los resultados en línea.
fuente
Si está usando mongodb 3.4.4 y superior, puede usar la agregación siguiente usando
$objectToArray
y$group
agregaciónAquí está el ejemplo de trabajo.
fuente
$match
al comienzo de la canalización de agregación para obtener solo las claves de los documentos que coinciden con una o varias condiciones.Me sorprende, nadie aquí tiene ans mediante el uso de simple
javascript
ySet
lógica para filtrar automáticamente los valores duplicados, ejemplo simple en mongo shell como a continuación:Esto imprimirá todas las claves únicas posibles en el nombre de la colección: collectionName .
fuente
Esto funciona bien para mi:
fuente
Creo que la mejor manera de hacer esto como se menciona aquí es en mongod 3.4.4+ pero sin usar el
$unwind
operador y usar solo dos etapas en la tubería. En cambio, podemos usar los operadores$mergeObjects
y$objectToArray
.En la
$group
etapa, utilizamos el$mergeObjects
operador para devolver un solo documento donde la clave / valor son de todos los documentos de la colección.Luego viene el lugar
$project
donde usamos$map
y$objectToArray
para devolver las llaves.Ahora, si tenemos documentos anidados y también queremos obtener las claves, esto es factible. Para simplificar, consideremos un documento con un documento incrustado simple que se vea así:
La siguiente canalización produce todas las claves (campo1, campo2, campo3, campo4).
Con un poco de esfuerzo, podemos obtener la clave para todos los subdocumentos en un campo de matriz donde los elementos también son objetos.
fuente
$unwind
explotará la colección (no. De campos * no. De documentos), podemos evitar eso al usar$mergeObjects
en todas las versiones>3.6
.. Hice lo mismo, debería haber visto esta respuesta antes, mi vida habría sido más fácil de esa manera ( -_-)Tal vez un poco fuera de tema, pero puede imprimir recursivamente todas las claves / campos de un objeto:
Útil cuando todos los objetos de una colección tienen la misma estructura.
fuente
Para obtener una lista de todas las teclas menos
_id
, considere ejecutar la siguiente tubería agregada:fuente
Estaba tratando de escribir en nodejs y finalmente se me ocurrió esto:
Después de leer la colección recién creada "allFieldNames", elimínela.
fuente
Según la documentación de mongoldb , una combinación de
distinct
y las operaciones de recopilación de índices son las que devolverían todos los valores posibles para una clave o índice dado:
Entonces, en un método dado, uno podría usar un método como el siguiente, para consultar una colección para todos sus índices registrados y regresar, digamos un objeto con los índices para las claves (este ejemplo usa async / await para NodeJS, pero obviamente, podría usar cualquier otro enfoque asincrónico):
Entonces, consultar una colección con el
_id
índice básico devolvería lo siguiente (la colección de prueba solo tiene un documento en el momento de la prueba):Eso sí, esto utiliza métodos nativos del controlador NodeJS. Como han sugerido algunas otras respuestas, existen otros enfoques, como el marco agregado. Personalmente, considero que este enfoque es más flexible, ya que puede crear y ajustar fácilmente cómo devolver los resultados. Obviamente, esto solo aborda los atributos de nivel superior, no los anidados. Además, para garantizar que todos los documentos estén representados en caso de que haya índices secundarios (que no sean el _id principal), esos índices deben establecerse como
required
.fuente
Podemos lograr esto utilizando el archivo mongo js. Agregue el código siguiente en su archivo getCollectionName.js y ejecute el archivo js en la consola de Linux como se indica a continuación:
Gracias @ackuser
fuente
Siguiendo el hilo de la respuesta de @James Cropcho, llegué a lo siguiente, que me pareció súper fácil de usar. Es una herramienta binaria, que es exactamente lo que estaba buscando: mongoeye .
Con esta herramienta, tardé unos 2 minutos en exportar mi esquema desde la línea de comandos.
fuente
Sé que esta pregunta tiene 10 años, pero no hay una solución de C # y esto me llevó horas resolverlo. Estoy usando el controlador .NET y
System.Linq
para devolver una lista de las claves.fuente
Extendí un poco la solución de Carlos LM para que sea más detallada.
Ejemplo de un esquema:
Escribe en la consola:
Correr:
Salida
fuente
Tengo 1 trabajo más simple alrededor ...
Lo que puede hacer es insertar datos / documentos en su colección principal "cosas", debe insertar los atributos en 1 colección separada, digamos "cosas_atributos".
así que cada vez que inserte en "cosas", obtiene de "cosas_atributos" comparar valores de ese documento con sus nuevas claves de documento si alguna clave nueva presente lo agrega en ese documento y lo vuelve a insertar.
Así que things_attributes tendrá solo 1 documento de claves únicas que puede obtener fácilmente cuando lo necesite utilizando findOne ()
fuente