Come selezionare un singolo campo per tutti i documenti in una raccolta MongoDB?


223

Nel mio MongoDB, ho una collezione di studenti con 10 record con campi namee roll. Un record di questa raccolta è:

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

Voglio recuperare il campo rollsolo per tutti e 10 i record nella raccolta come faremmo nel database tradizionale usando:

SELECT roll FROM student

Ho esaminato molti blog, ma tutti stanno generando una query che deve contenere una WHEREclausola, ad esempio:

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

La query equivale a:

SELECT * FROM student WHERE roll > 70

Il mio requisito è di trovare una sola chiave senza alcuna condizione. Quindi, qual è l'operazione di query per quello.


@NeilLunn Grazie per il collegamento da SQL a MongoDB Mapping . Non so come mi sia perso.
Shipra Swati,

Risposte:


255

Dai documenti MongoDB :

Una proiezione può includere esplicitamente diversi campi. Nella seguente operazione, il metodo find () restituisce tutti i documenti che corrispondono alla query. Nel set di risultati, solo i campi item e qty e, per impostazione predefinita, il campo _id vengono restituiti nei documenti corrispondenti.

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

In questo esempio dai ragazzi di Mongo, i documenti restituiti conterranno solo i campi di item, qtye_id .


Pertanto, dovresti essere in grado di rilasciare una dichiarazione come:

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

La suddetta dichiarazione selezionerà tutti i documenti nella raccolta degli studenti e il documento restituito restituirà solo il rollcampo (ed escluderà il_id ).

Se non menzioniamo _id:0i campi restituiti saranno rolle _id. Il campo '_id' è sempre visualizzato per impostazione predefinita. Quindi dobbiamo menzionare esplicitamente _id:0insieme a roll.


9
Non riesco a Google questo, quindi vale la pena provare. Devi escludere esplicitamente tutti i campi che non vuoi? Supponiamo che tu voglia un solo campo ma il documento ne ha 10 che devi impostare esplicitamente 0per 9 di essi? Modifica: Nevermind, escluso _idie {field_I_want:1, _id:0}sembra funzionare
Karl Tryggvason

È possibile aggiungere un campo e quindi aggiornare il documento se utilizzo le proiezioni?
Chovy

3
Nessuna delle risposte menziona effettivamente quanto segue: Nota: With the exception of the _id field, you cannot combine inclusion and exclusion statements in projection documents.questo potrebbe essere interessante per alcuni di voi. ( fonte )
user0800

137

ottenere tutti i dati dalla tabella

db.student.find({})

SELEZIONA * DA studente


ottenere tutti i dati dalla tabella senza _id

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

SELEZIONA nome, tira DA studente


ottenere tutti i dati da un campo con _id

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

SELEZIONA ID, rotola DA studente


ottenere tutti i dati da un campo senza _id

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

SELEZIONA rotolo DA studente


trova i dati specificati usando la clausola where

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

SELEZIONA * DAGLI STUDENTI DOVE roll = '80'


trova un dato usando la clausola where e maggiore della condizione

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

SELEZIONA * DALLO STUDENTE DOVE tira> '70'


trova un dato usando la clausola where e maggiore o uguale alla condizione

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

SELEZIONA * DALLO STUDENTE DOVE roll> = '70'


trova un dato usando la clausola where e minore o uguale alla condizione

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

SELEZIONA * DALLO STUDENTE DOVE roll <= '70'


trova un dato usando la clausola where e meno che da condizionare

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

SELEZIONA * DALLO STUDENTE DOVE tira <'70'



2
Volevo solo aggiungere, poiché la tua risposta mi ha aiutato a capire la mia soluzione, per visualizzare tutte le proprietà tranne _id sarebbe db.student.find({}, {_id:0})Grazie per l'aiuto.
user8675309

58

Penso che mattingly890 abbia la risposta corretta, ecco un altro esempio insieme al modello / commmand

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

inserisci qui la descrizione dell'immagine


per mostrare l'output di mongo e cosa restituisce come esempio.
grepit,

Amico mi hai dato un voto negativo perché avevo incluso uno screenshot nella mia risposta?
grepit,

Sì, e anche perché non vedo cosa porta la tua risposta dalla risposta di @therealrootuser
Guillaume Lebreton

10

Ecco qui, 3 modi di fare, dal più breve al noioso:

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

Per rimuovere l'- operatore di campo specifico utilizzare :

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

1
Penso che i tuoi comandi citati provengano da mangusta e non da mongodb tranne il terzo.
Ashish,

8

Solo a scopo educativo potresti anche farlo in uno dei seguenti modi:

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

Prova la seguente query:

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

Spero che questo ti aiuti!!


pretty () sarà utile solo quando si esegue tramite shell, non dagli script.
Dinakar,

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

Nel tuo esempio, puoi fare qualcosa del tipo:

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

Proiezione

Il parametro di proiezione determina quali campi vengono restituiti nei documenti corrispondenti. Il parametro di proiezione prende un documento nel seguente formato:

{ field1: <value>, field2: <value> ... }
The <value> can be any of the following:
  1. 1 o true per includere il campo nei documenti di ritorno.

  2. 0 o falso per escludere il campo.

NOTA

Per il campo _id, non è necessario specificare esplicitamente _id: 1 per restituire il campo _id. Il metodo find () restituisce sempre il campo _id a meno che non specifichi _id: 0 per sopprimere il campo.

LEGGI DI PIÙ


7

Mentre la risposta di gowtham è completa, vale la pena notare che quei comandi possono differire da API a un altro (per coloro che non usano la shell di mongo).
Fare riferimento al collegamento alla documentazione per informazioni dettagliate.

Nodejs , per esempio, ha un metodo chiamato `proiezione che dovresti aggiungere alla tua funzione find per proiettare.

Seguendo lo stesso set di esempi, è possibile utilizzare comandi come i seguenti con Nodo:

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

SELEZIONA _id, tira DA studente

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

SELEZIONA rotolo DA studente

e così via.

Ancora una volta per gli utenti nodejs, non dimenticare (cosa dovresti già avere familiarità se hai usato prima questa API) da usare toArrayper aggiungere il tuo .thencomando.


4

Per una migliore comprensione ho scritto una query MySQL simile.

Selecting specific fields 

MongoDB: db.collection_name.find ({}, {nome: vero, email: vero, telefono: vero});

MySQL: SELEZIONA nome, email, telefono DA table_name;

Selecting specific fields with where clause

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

MySQL: SELEZIONA nome, email, telefono DA table_name DOVE email = 'you@email.com';


3

Questo funziona per me,

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

nessuna condizione in cui la clausola ie, all'interno delle prime parentesi graffe. all'interno delle parentesi graffe successive: l'elenco dei nomi dei campi di proiezione necessari nel risultato e 1 indica che un particolare campo è la parte del risultato della query


2

ottenere il nome dello studente

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

ottenere il nome e il ruolo dello studente

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

2

La query per MongoDB qui commissioni è raccolta e la descrizione è un campo.

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

1

Se si desidera recuperare il campo "roll" solo per tutti e 10 i record nelle raccolte. Allora prova questo.

In MongoDb:

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

In Sql:

seleziona rotolo dagli studenti


1

Voglio solo aggiungere alle risposte che se si desidera visualizzare un campo nidificato in un altro oggetto, è possibile utilizzare la sintassi seguente

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

Qui la chiave è presente all'interno dell'oggetto denominato object

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

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

Ciò equivale a -

Seleziona rotolo dallo studente



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

Ciò equivale a -

Seleziona rotolo, nome da studente


0

Utilizzare la query in questo modo nella shell:

1. Usadatabase_name

e.g: use database_name

2. Che restituisce solo asset particolari informazioni sul campo quando abbinato, _id:0specifica di non visualizzare l'ID nel risultato

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

0

In mongodb 3.4 possiamo usare la logica di seguito, non sono sicuro delle versioni precedenti

seleziona rotolo da studente ==> db.student.find (! {}, {roll: 1})

la logica sopra aiuta a definire alcune colonne (se sono meno)


0

Usando Studio 3T per MongoDB, se lo uso .find({}, { _id: 0, roll: true })restituisco comunque una matrice di oggetti con una _idproprietà vuota .

L'uso di JavaScript mapmi ha aiutato a recuperare la rollproprietà desiderata solo come una matrice di stringhe:

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

0

Non sono sicuro che questo risponda alla domanda, ma credo che valga la pena menzionarlo qui. C'è un altro modo per selezionare un singolo campo (e non più) usandodb.collection_name.distinct();

per esempio,db.student.distinct('roll',{});

Oppure, secondo modo: utilizzando db.collection_name.find().forEach();(più campi possono essere selezionati qui per concatenazione)

per esempio, db.collection_name.find().forEach(function(c1){print(c1.roll);});

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.