Eu gostaria de obter os nomes de todas as chaves em uma coleção do MongoDB.
Por exemplo, disso:
db.things.insert( { type : ['dog', 'cat'] } );
db.things.insert( { egg : ['cat'] } );
db.things.insert( { type : [] } );
db.things.insert( { hello : [] } );
Gostaria de obter as chaves exclusivas:
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; });
Com a resposta de Kristina como inspiração, criei uma ferramenta de código aberto chamada Variety, que faz exatamente isso: https://github.com/variety/variety
fonte
Você pode usar a agregação com o novo
$objectToArrray
na3.4.4
versão para converter todos os pares principais de chave e valor em matrizes de documentos seguidos por$unwind
&$group
com$addToSet
para obter chaves distintas em toda a coleção.$$ROOT
para referenciar o documento de nível superior.Você pode usar a consulta abaixo para obter chaves em um único documento.
fonte
.next()["allkeys"]
ao comando (assumindo que a coleção tenha pelo menos um elemento).Tente o seguinte:
fonte
Se sua coleção de destino não for muito grande, você pode tentar isso no mongo shell client:
fonte
Uma solução limpa e reutilizável usando pymongo:
Uso:
fonte
if (typeof(this[key]) == 'number')
antesemit(key, null)
.Usando python. Retorna o conjunto de todas as chaves de nível superior na coleção:
fonte
Aqui está o exemplo trabalhado em Python: Este exemplo retorna os resultados em linha.
fonte
Se você estiver usando o mongodb 3.4.4 e superior, poderá usar a agregação abaixo usando
$objectToArray
e a$group
agregaçãoAqui está o exemplo de trabalho
fonte
$match
no início do pipeline de agregação para obter apenas as chaves dos documentos que correspondem às condições.Estou surpreso, ninguém aqui tem ans usando simple
javascript
eSet
logic para filtrar automaticamente os valores de duplicatas, exemplo simples no mongo shell como abaixo:Isso imprimirá todas as chaves exclusivas possíveis no nome da coleção: collectionName .
fonte
Este trabalho é bom para mim:
fonte
Eu acho que a melhor maneira de fazer isso, conforme mencionado aqui, é no mongod 3.4.4+, mas sem usar o
$unwind
operador e usando apenas dois estágios no pipeline. Em vez disso, podemos usar o$mergeObjects
e$objectToArray
operadores.No
$group
estágio, usamos o$mergeObjects
operador para retornar um único documento em que chave / valor são de todos os documentos da coleção.Depois vem o local
$project
onde usamos$map
e$objectToArray
para retornar as chaves.Agora, se tivermos documentos aninhados e quisermos obter as chaves também, isso é possível. Para simplificar, vamos considerar um documento com documento incorporado simples que se parece com isso:
O pipeline a seguir produz todas as chaves (campo1, campo2, campo3, campo4).
Com um pouco de esforço, podemos obter a chave para todos os subdocumentos em um campo de matriz em que os elementos também são objetos.
fonte
$unwind
explodirá a coleção (no.of fields * no.of docs), podemos evitar isso usando$mergeObjects
em todas as versões>3.6
.. Fiz o mesmo, deveria ter visto essa resposta antes, minha vida teria sido mais fácil dessa maneira ( -_-)Talvez um pouco fora do tópico, mas você pode imprimir recursivamente todas as chaves / campos de um objeto:
Útil quando todos os objetos em uma coleção têm a mesma estrutura.
fonte
Para obter uma lista de todas as chaves menos
_id
, considere executar o seguinte pipeline agregado:fonte
Eu estava tentando escrever em nodejs e finalmente surgiu com isso:
Depois de ler a coleção recém-criada "allFieldNames", exclua-a.
fonte
De acordo com a documentação do mongoldb , uma combinação de
distinct
e operações de coleta de índices são o que retornaria todos os valores possíveis para uma determinada chave ou índice:
Portanto, em um determinado método, poderia-se usar um método como o seguinte, para consultar uma coleção por todos os seus índices registrados e retornar, digamos, um objeto com os índices das chaves (este exemplo usa async / waitit para NodeJS, mas obviamente, você poderia usar qualquer outra abordagem assíncrona):
Portanto, consultar uma coleção com o
_id
índice básico retornaria o seguinte (a coleção de teste possui apenas um documento no momento do teste):Lembre-se, isso usa métodos nativos para o driver NodeJS. Como algumas outras respostas sugeriram, existem outras abordagens, como a estrutura agregada. Pessoalmente, acho essa abordagem mais flexível, pois você pode criar e ajustar com facilidade como retornar os resultados. Obviamente, isso aborda apenas atributos de nível superior, não aninhados. Além disso, para garantir que todos os documentos sejam representados, caso haja índices secundários (que não sejam o principal _id), esses índices devem ser definidos como
required
.fonte
Podemos conseguir isso usando o arquivo mongo js. Adicione o código abaixo no seu arquivo getCollectionName.js e execute o arquivo js no console do Linux, conforme indicado abaixo:
Obrigado @ackuser
fonte
Seguindo o tópico da resposta de @James Cropcho, cheguei ao seguinte, que achei super fácil de usar. É uma ferramenta binária, que é exatamente o que eu estava procurando: mongoeye .
Usando essa ferramenta, demorou cerca de 2 minutos para obter meu esquema exportado da linha de comando.
fonte
Eu sei que esta pergunta tem 10 anos, mas não há solução C # e isso me levou horas para descobrir. Estou usando o driver .NET e
System.Linq
para retornar uma lista das chaves.fonte
Estendi um pouco a solução de Carlos LM para ficar mais detalhada.
Exemplo de um esquema:
Digite no console:
Corre:
Resultado
fonte
Eu tenho 1 solução mais simples ...
O que você pode fazer é ao inserir dados / documento em sua coleção principal "coisas", você deve inserir os atributos em uma coleção separada, digamos "coisas_atributos".
portanto, toda vez que você insere "coisas", você obtém de "things_attributes" compara valores desse documento com suas novas chaves de documento, se alguma nova chave presente o anexa nesse documento e a reinsere.
Portanto, things_attributes terá apenas 1 documento de chaves exclusivas, que você poderá obter facilmente sempre que precisar, usando findOne ()
fonte