Como selecionar um único campo para todos os documentos em uma coleção do MongoDB?


223

No meu MongoDB, tenho uma coleção de alunos com 10 registros com campos namee roll. Um registro desta coleção é:

{
    "_id" : ObjectId("53d9feff55d6b4dd1171dd9e"),
    "name" : "Swati",
    "roll" : "80",
}

Quero recuperar o campo rollapenas para todos os 10 registros da coleção, como faríamos no banco de dados tradicional usando:

SELECT roll FROM student

Eu passei por muitos blogs, mas todos estão resultando em uma consulta que deve conter uma WHEREcláusula, por exemplo:

db.students.find({ "roll": { $gt: 70 })

A consulta é equivalente a:

SELECT * FROM student WHERE roll > 70

Minha exigência é encontrar uma única chave apenas sem nenhuma condição. Então, qual é a operação de consulta para isso.


@NeilLunn Obrigado pelo link SQL para o MongoDB Mapping . Não sei como eu perdi isso.
Shipra Swati

Respostas:


255

Nos documentos do MongoDB :

Uma projeção pode incluir explicitamente vários campos. Na operação a seguir, o método find () retorna todos os documentos que correspondem à consulta. No conjunto de resultados, apenas os campos item e qty e, por padrão, o campo _id retornam nos documentos correspondentes.

db.inventory.find ({type: 'food'}, {item: 1, qty: 1})

Neste exemplo dos povos no Mongo, os documentos retornados conterá apenas os campos de item, qtye _id.


Portanto, você deve poder emitir uma declaração como:

db.student.find({}, {roll:1, _id:0})

A declaração acima selecionará todos os documentos da coleção de alunos e o documento retornado retornará apenas o rollcampo (e excluirá o _id).

Se não mencionarmos, _id:0os campos retornados serão rolle _id. O campo '_id' é sempre exibido por padrão. Então, precisamos mencionar explicitamente _id:0junto com roll.


9
Não parece Google isso, então vale a pena tentar. Você precisa excluir explicitamente todos os campos que não deseja? Digamos que você queira apenas um campo, mas o documento tem 10 que você precisa definir explicitamente 0para 9 deles? Edit: Deixa pra lá, excluindo, _idou seja, {field_I_want:1, _id:0}parece funcionar #
Karl Tryggvason

É possível adicionar um campo e atualizar o documento se eu usar projeções?
chovy

3
Nenhuma das respostas menciona o seguinte: Nota: With the exception of the _id field, you cannot combine inclusion and exclusion statements in projection documents.Isso pode ser interessante para alguns de vocês. ( source )
user0800

137

obter todos os dados da tabela

db.student.find({})

SELECT * FROM aluno


obter todos os dados da tabela sem _id

db.student.find({}, {_id:0})

SELECIONE o nome, role do aluno


obtenha todos os dados de um campo com _id

db.student.find({}, {roll:1})

SELECT id, role FROM aluno


obtenha todos os dados de um campo sem _id

db.student.find({}, {roll:1, _id:0})

SELECIONAR rolo do aluno


encontre dados especificados usando a cláusula where

db.student.find({roll: 80})

SELECIONE * DOS ALUNOS ONDE roll = '80'


encontre um dado usando a cláusula where e maior que a condição

db.student.find({ "roll": { $gt: 70 }}) // $gt is greater than 

SELECIONE * DO ALUNO ONDE rolar> '70'


encontre dados usando a cláusula where e maior ou igual à condição

db.student.find({ "roll": { $gte: 70 }}) // $gte is greater than or equal

SELECT * FROM student WHERE roll> = '70'


encontre dados usando a cláusula where e menor ou igual à condição

db.student.find({ "roll": { $lte: 70 }}) // $lte is less than or equal

SELECT * FROM student WHERE role <= '70'


encontre um dado usando a cláusula where e menos que condicionar

db.student.find({ "roll": { $lt: 70 }})  // $lt is less than

SELECT * FROM student WHERE role <'70'



2
Só queria acrescentar, já que sua resposta me ajudou a descobrir minha solução, exibir todas as propriedades, exceto _id, seria db.student.find({}, {_id:0})Obrigado pela ajuda.
user8675309

58

Eu acho que mattingly890 tem a resposta correta, aqui está outro exemplo junto com o padrão / comando

db.collection.find( {}, {your_key:1, _id:0})

insira a descrição da imagem aqui


para mostrar a saída do mongo e o que ele retorna como um exemplo.
grepit

Cara, você me deu uma votação negativa porque eu incluíra a captura de tela na minha resposta?
grepit

Sim, e também porque eu não vejo o que sua resposta traz nova de @therealrootuser 's anwer
Guillaume Lebreton

10

Aqui está, 3 maneiras de fazer, Mais curto para o chato:

db.student.find({}, 'roll _id'); // <--- Just multiple fields name space separated
// OR
db.student.find({}).select('roll _id'); // <--- Just multiple fields name space separated
// OR
db.student.find({}, {'roll' : 1 , '_id' : 1 ); // <---- Old lengthy boring way

Para remover um campo específico, use o -operador:

db.student.find({}).select('roll -_id') // <--- Will remove id from result

1
Eu acho que seus comandos mencionados são do mangusto e não do mongodb, exceto o terceiro.
Ashish

8

Apenas para fins educacionais, você também pode fazê-lo de qualquer uma das seguintes maneiras:

1

    var query = {"roll": {$gt: 70};
    var cursor = db.student.find(query);
    cursor.project({"roll":1, "_id":0});

2)

    var query = {"roll": {$gt: 70};
    var projection = {"roll":1, "_id":0};
    var cursor = db.student.find(query,projection);

`


8

Tente a seguinte consulta:

db.student.find({}, {roll: 1, _id: 0}).pretty();

Espero que isto ajude!!


pretty () só será útil ao executar via shell, não a partir de scripts.
Dinakar

7
db.<collection>.find({}, {field1: <value>, field2: <value> ...})

No seu exemplo, você pode fazer algo como:

db.students.find({}, {"roll":true, "_id":false})

Projeção

O parâmetro de projeção determina quais campos são retornados nos documentos correspondentes. O parâmetro de projeção assume um documento do seguinte formato:

{ field1: <value>, field2: <value> ... }
The <value> can be any of the following:
  1. 1 ou true para incluir o campo nos documentos de devolução.

  2. 0 ou falso para excluir o campo.

NOTA

Para o campo _id, você não precisa especificar explicitamente _id: 1 para retornar o campo _id. O método find () sempre retorna o campo _id, a menos que você especifique _id: 0 para suprimir o campo.

CONSULTE MAIS INFORMAÇÃO


7

Embora a resposta de gowtham esteja completa, é importante notar que esses comandos podem diferir da API para outra (para aqueles que não usam o shell do mongo).
Consulte o link da documentação para obter informações detalhadas.

Os Nodejs , por exemplo, têm um método chamado `projection que você acrescentaria à sua função find para projetar.

Seguindo o mesmo conjunto de exemplos, comandos como os seguintes podem ser usados ​​com o Node:

db.student.find({}).project({roll:1})

SELECT _id, role FROM aluno

Ou
db.student.find({}).project({roll:1, _id: 0})

SELECIONAR rolo do aluno

e assim por diante.

Novamente para usuários do nodejs, não se esqueça (com o que você já deveria estar familiarizado se usou essa API antes) para usar toArraypara anexar seu .thencomando.


4

Para uma melhor compreensão, escrevi uma consulta MySQL semelhante.

Selecting specific fields 

MongoDB: db.collection_name.find ({}, {name: true, email: true, telefone: true});

MySQL: SELECT nome, email, telefone FROM nome_tabela;

Selecting specific fields with where clause

MongoDB: db.collection_name.find ({email:'you@email.com '}, {nome: true, email: true, telefone: true});

MySQL: SELECT nome, email, telefone FROM table_name WHERE email = 'you@email.com';


3

Isso funciona para mim,

db.student.find({},{"roll":1})

nenhuma condição na cláusula where, ou seja, dentro das primeiras chaves. dentro dos próximos chavetas: lista de nomes de campos de projeção a serem necessários no resultado e 1 indica que um campo específico é a parte do resultado da consulta


2

recebendo o nome do aluno

student-details = db.students.find({{ "roll": {$gt: 70} },{"name": 1, "_id": False})

recebendo o nome e o rolo do aluno

student-details = db.students.find({{ "roll": {$gt: 70}},{"name": 1,"roll":1,"_id": False})

2

A consulta para taxas do MongoDB aqui é coleta e descrição é um campo.

db.getCollection('fees').find({},{description:1,_id:0})

1

Se você deseja recuperar o campo "roll" apenas para todos os 10 registros nas coleções. Então tente isso.

No MongoDb:

db.students.find ({}, {"roll": {"$ roll"})

No Sql:

selecionar lista de alunos


1

Eu só quero adicionar às respostas que, se você quiser exibir um campo aninhado em outro objeto, poderá usar a seguinte sintaxe

db.collection.find( {}, {{'object.key': true}})

Aqui a chave está presente dentro do objeto chamado object

{ "_id" : ObjectId("5d2ef0702385"), "object" : { "key" : "value" } }

0
db.student.find({}, {"roll":1, "_id":0})

Isso é equivalente a -

Selecionar rolo do aluno



db.student.find ({}, {"roll": 1, "name": 1, "_id": 0})

Isso é equivalente a -

Selecionar rolo, nome do aluno


0

Use a Consulta como esta no shell:

1. Usedatabase_name

e.g: use database_name

2. Que retorna apenas informações específicas de campo dos ativos quando correspondidas, _id:0especifica para não exibir o ID no resultado

db.collection_name.find( { "Search_Field": "value" }, 
                  { "Field_to_display": 1,_id:0 }  )

0

No mongodb 3.4, podemos usar a lógica abaixo, não tenho certeza sobre as versões anteriores

selecione rolo do aluno ==> db.student.find (! {}, {roll: 1})

a lógica acima ajuda a definir algumas colunas (se forem menores)


0

Usando o Studio 3T para MongoDB, se eu usá- .find({}, { _id: 0, roll: true })lo ainda retornará uma matriz de objetos com uma _idpropriedade vazia .

O uso do JavaScript mapme ajudou a recuperar apenas a rollpropriedade desejada como uma matriz de string:

var rolls = db.student
  .find({ roll: { $gt: 70 } }) // query where role > 70
  .map(x => x.roll);           // return an array of role

0

Não sei se isso responde à pergunta, mas acredito que vale a pena mencionar aqui. Há mais uma maneira de selecionar um campo (e não vários) usandodb.collection_name.distinct();

por exemplo,db.student.distinct('roll',{});

Ou, segunda maneira: Usando db.collection_name.find().forEach();(vários campos podem ser selecionados aqui por concatenação)

por exemplo, db.collection_name.find().forEach(function(c1){print(c1.roll);});

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.