¿Cómo seleccionar un solo campo para todos los documentos en una colección MongoDB?

223

En mi MongoDB, tengo una colección de estudiantes con 10 registros que tienen campos namey roll. Un registro de esta colección es:

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

Quiero recuperar el campo rollsolo para los 10 registros de la colección como lo haríamos en la base de datos tradicional usando:

SELECT roll FROM student

Revisé muchos blogs, pero todos dan como resultado una consulta que debe tener una WHEREcláusula, por ejemplo:

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

La consulta es equivalente a:

SELECT * FROM student WHERE roll > 70

Mi requisito es encontrar una sola clave solo sin ninguna condición. Entonces, ¿cuál es la operación de consulta para eso?

Shipra Swati
fuente
@NeilLunn Gracias por el enlace SQL a la asignación de MongoDB . No sé cómo me perdí esto.
Shipra Swati

Respuestas:

255

De los documentos de MongoDB :

Una proyección puede incluir explícitamente varios campos. En la siguiente operación, el método find () devuelve todos los documentos que coinciden con la consulta. En el conjunto de resultados, solo los campos ítem y cantidad y, por defecto, el campo _id regresan en los documentos coincidentes.

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

En este ejemplo de la gente en Mongo, los documentos devueltos contendrán sólo los campos de item, qtyy _id.


Por lo tanto, debe poder emitir una declaración como:

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

La declaración anterior seleccionará todos los documentos en la colección de estudiantes, y el documento devuelto devolverá solo el rollcampo (y excluirá el _id).

Si no mencionamos _id:0los campos devueltos serán rolly _id. El campo '_id' siempre se muestra de forma predeterminada. Por lo tanto, debemos mencionar explícitamente _id:0junto con roll.

usuario de raíz
fuente
99
Parece que Google no puede hacerlo, así que vale la pena intentarlo. ¿Tiene que excluir explícitamente todos los campos que no desea? Supongamos que solo desea un campo pero el documento tiene 10 que debe establecer explícitamente 0para 9 de ellos. Editar: No importa, excluyendo, _ides decir, {field_I_want:1, _id:0}parece funcionar
Karl Tryggvason
¿Es posible agregar un campo y luego actualizar el documento si uso proyecciones?
chovy
3
En realidad, ninguna de las respuestas menciona lo siguiente: Nota: With the exception of the _id field, you cannot combine inclusion and exclusion statements in projection documents.Esto podría ser interesante para algunos de ustedes. ( fuente )
user0800
137

obtener todos los datos de la tabla

db.student.find({})

SELECCIONAR * DE estudiante


obtener todos los datos de la tabla sin _id

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

SELECCIONE nombre, pase de estudiante


obtener todos los datos de un campo con _id

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

SELECCIONE ID, pase de estudiante


obtener todos los datos de un campo sin _id

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

SELECCIONAR rollo de estudiante


buscar datos especificados utilizando la cláusula where

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

SELECCIONE * DE los estudiantes DONDE roll = '80'


buscar datos usando la cláusula where y mayor que la condición

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

SELECCIONE * DEL alumno DONDE ruede> '70'


buscar datos utilizando la cláusula where y una condición mayor o igual que

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

SELECCIONE * DEL alumno DONDE ruede> = '70'


buscar datos utilizando la cláusula where y una condición menor o igual que

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

SELECCIONE * DEL alumno DONDE ruede <= '70'


buscar datos utilizando la cláusula where y menos que condicionar

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

SELECCIONE * DEL alumno DONDE ruede <'70'


Gowtham Sooryaraj
fuente
2
Solo quería agregar, ya que su respuesta me ayudó a descubrir mi solución, para mostrar todas las propiedades, excepto _id sería db.student.find({}, {_id:0})Gracias por la ayuda.
user8675309
58

Creo que mattingly890 tiene la respuesta correcta, aquí hay otro ejemplo junto con el patrón / comando

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

ingrese la descripción de la imagen aquí

grepit
fuente
para mostrar la salida de mongo y lo que devuelve como ejemplo.
grepit
Amigo, ¿me diste un voto negativo porque había incluido una captura de pantalla en mi respuesta?
grepit
Sí, y también porque no veo lo que su respuesta trae nueva de la respuesta de @therealrootuser
Guillaume Lebreton
10

Aquí tienes, 3 formas de hacerlo, la más corta a la aburrida:

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 eliminar el campo específico, utilice el -operador:

db.student.find({}).select('roll -_id') // <--- Will remove id from result
Vivek Doshi
fuente
1
Creo que sus comandos mencionados son de mangosta y no mongodb, excepto el tercero.
Ashish
8

Solo con fines educativos, también puede hacerlo con cualquiera de las siguientes formas:

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
fuente
8

Pruebe la siguiente consulta:

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

¡¡Espero que esto ayude!!

Karan Khanna
fuente
pretty () solo será útil cuando se ejecute a través de shell, no desde scripts.
Dinakar
7
db.<collection>.find({}, {field1: <value>, field2: <value> ...})

En su ejemplo, puede hacer algo como:

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

Proyección

El parámetro de proyección determina qué campos se devuelven en los documentos coincidentes. El parámetro de proyección toma un documento de la siguiente forma:

{ field1: <value>, field2: <value> ... }
The <value> can be any of the following:
  1. 1 o verdadero para incluir el campo en los documentos de devolución.

  2. 0 o falso para excluir el campo.

NOTA

Para el campo _id, no tiene que especificar explícitamente _id: 1 para devolver el campo _id. El método find () siempre devuelve el campo _id a menos que especifique _id: 0 para suprimir el campo.

LEE MAS

Anthony Awuley
fuente
7

Si bien la respuesta de gowtham está completa, vale la pena señalar que esos comandos pueden diferir de una API a otra (para aquellos que no usan el shell de mongo).
Consulte el enlace de documentación para obtener información detallada.

Los nodejs , por ejemplo, tienen un método llamado `proyección que agregaría a su función de búsqueda para proyectar.

Siguiendo el mismo conjunto de ejemplos, se pueden usar comandos como los siguientes con Node:

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

SELECCIONE _id, pase de estudiante

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

SELECCIONAR rollo de estudiante

y así.

Una vez más, para los usuarios de nodejs, no olviden (con lo que ya deberían estar familiarizados si antes usaban esta API) toArraypara agregar su .thencomando.

Sonriente
fuente
4

Para una mejor comprensión, he escrito una consulta MySQL similar.

Selecting specific fields 

MongoDB: db.collection_name.find ({}, {nombre: verdadero, correo electrónico: verdadero, teléfono: verdadero});

MySQL: SELECCIONE nombre, correo electrónico, teléfono DESDE nombre_tabla;

Selecting specific fields with where clause

MongoDB: db.collection_name.find ({email:'[email protected] '}, {name: true, email: true, phone: true});

MySQL: SELECCIONE nombre, correo electrónico, teléfono DESDE table_name WHERE email = '[email protected]';

Hasib Kamal
fuente
3

Esto funciona para mi

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

sin condición en la cláusula where, es decir, dentro de las primeras llaves. dentro de las próximas llaves: la lista de nombres de campos de proyección que se necesitarán en el resultado y 1 indica que un campo particular es la parte del resultado de la consulta

Aishwarya Panchal
fuente
2

obtener el nombre del alumno

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

obtener nombre y rol del estudiante

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

La consulta para las tarifas de MongoDB aquí es la recopilación y la descripción es un campo.

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

Si desea recuperar el campo "roll" solo para los 10 registros en las colecciones. Entonces prueba esto.

En MongoDb:

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

En SQL:

seleccione rollo de estudiantes

Biju Maharjan
fuente
1

Solo quiero agregar a las respuestas que si desea mostrar un campo anidado en otro objeto, puede usar la siguiente sintaxis

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

Aquí la clave está presente dentro del objeto llamado objeto

{ "_id" : ObjectId("5d2ef0702385"), "object" : { "key" : "value" } }
Sampath Surineni
fuente
0
db.student.find({}, {"roll":1, "_id":0})

Esto es equivalente a -

Seleccionar rollo de estudiante



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

Esto es equivalente a -

Seleccionar rollo, nombre del alumno

Rito
fuente
0

Use la consulta como esta en el shell:

1. Usodatabase_name

e.g: use database_name

2. Que solo devuelve información de campo particular de los activos cuando coincide, _id:0especifica que no se muestre ID en el resultado

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

En mongodb 3.4 podemos usar la lógica a continuación, no estoy seguro acerca de las versiones anteriores

seleccione roll from student ==> db.student.find (! {}, {roll: 1})

la lógica anterior ayuda a definir algunas columnas (si son menos)

Pulla
fuente
0

Usando Studio 3T para MongoDB, si lo uso .find({}, { _id: 0, roll: true })aún devuelve una matriz de objetos con un vacío_id propiedad .

El uso de JavaScript mapme ayudó a recuperar solo la rollpropiedad deseada como una matriz de cadenas:

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

No estoy seguro de que esto responda la pregunta, pero creo que vale la pena mencionarlo aquí. Hay una forma más de seleccionar un solo campo (y no múltiples) usandodb.collection_name.distinct();

p.ej,db.student.distinct('roll',{});

O, segunda forma: usar db.collection_name.find().forEach(); (se pueden seleccionar varios campos aquí por concatenación)

p.ej, db.collection_name.find().forEach(function(c1){print(c1.roll);});

Ashish
fuente