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.

Shipra Swati
fonte
@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.

therealrootuser
fonte
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'


Gowtham Sooryaraj
fonte
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

grepit
fonte
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
Vivek Doshi
fonte
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);

`

Vaggelis Stefanakis
fonte
8

Tente a seguinte consulta:

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

Espero que isto ajude!!

Karan Khanna
fonte
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

Anthony Awuley
fonte
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.

Smily
fonte
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:'[email protected] '}, {nome: true, email: true, telefone: true});

MySQL: SELECT nome, email, telefone FROM table_name WHERE email = '[email protected]';

Hasib Kamal
fonte
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

Aishwarya Panchal
fonte
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})
PrabhuPrakash
fonte
2

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

db.getCollection('fees').find({},{description:1,_id:0})
Ankit Kumar Rajpoot
fonte
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

Biju Maharjan
fonte
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" } }
Sampath Surineni
fonte
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

Rito
fonte
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 }  )
Hari Krishna Setty
fonte
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)

Pulla
fonte
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
j3ff
fonte
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);});

Ashish
fonte