Comment sélectionner un seul champ pour tous les documents d'une collection MongoDB?


223

Dans mon MongoDB, j'ai une collection d'étudiants avec 10 enregistrements ayant des champs nameet roll. Un enregistrement de cette collection est:

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

Je souhaite récupérer le champ rolluniquement pour les 10 enregistrements de la collection comme nous le ferions dans la base de données traditionnelle en utilisant:

SELECT roll FROM student

J'ai parcouru de nombreux blogs mais tous aboutissent à une requête qui doit WHEREcontenir une clause, par exemple:

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

La requête équivaut à:

SELECT * FROM student WHERE roll > 70

Mon exigence est de trouver une seule clé sans aucune condition. Alors, quelle est l'opération de requête pour cela.


@NeilLunn Merci pour le lien SQL vers MongoDB Mapping . Je ne sais pas comment j'ai raté ça.
Shipra Swati

Réponses:


255

À partir des documents MongoDB :

Une projection peut inclure explicitement plusieurs champs. Dans l'opération suivante, la méthode find () renvoie tous les documents qui correspondent à la requête. Dans le jeu de résultats, seuls les champs item et qty et, par défaut, le champ _id retournent dans les documents correspondants.

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

Dans cet exemple , des gens de Mongo, les documents retournés ne contiendront que les champs de item, qtyet _id.


Ainsi, vous devriez pouvoir émettre une déclaration telle que:

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

L'instruction ci-dessus sélectionnera tous les documents de la collection des étudiants et le document retourné renverra uniquement le rollchamp (et exclura le _id).

Si nous ne mentionnons pas _id:0les champs retournés seront rollet _id. Le champ '_id' est toujours affiché par défaut. Nous devons donc mentionner explicitement _id:0avec roll.


9
Je ne peux pas sembler à Google, donc ça vaut le coup Devez-vous exclure explicitement tous les champs dont vous ne voulez pas? Disons que vous ne voulez qu'un seul champ mais que le document en a 10 que vous devez définir explicitement 0pour 9 d'entre eux? Edit: Nevermind, excluant _idie {field_I_want:1, _id:0}semble fonctionner
Karl Tryggvason

Est-il possible d'ajouter un champ puis de mettre à jour le document si j'utilise des projections?
chovy

3
Aucune des réponses ne mentionne en fait ce qui suit: Remarque: With the exception of the _id field, you cannot combine inclusion and exclusion statements in projection documents.Cela pourrait être intéressant pour certains d'entre vous. ( source )
user0800

137

obtenir toutes les données de la table

db.student.find({})

CHOISIR * DEPUIS l'élève


obtenir toutes les données de la table sans _id

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

CHOISIR le nom, lancer DE l'élève


obtenir toutes les données d'un champ avec _id

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

SELECT id, roll FROM student


obtenir toutes les données d'un champ sans _id

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

CHOISISSEZ le rouleau de l'étudiant


rechercher les données spécifiées à l'aide de la clause where

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

CHOISIR * DES ÉTUDIANTS O roll rouler = '80'


rechercher une donnée en utilisant la clause where et une condition supérieure à

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

SÉLECTIONNEZ * DEPUIS l'élève OERE rouler> '70'


trouver une donnée en utilisant la clause where et une condition supérieure ou égale à

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

SÉLECTIONNEZ * DE l'élève O student rouler> = '70'


trouver une donnée en utilisant la clause where et inférieure ou égale à la condition

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

CHOISIR * DEPUIS l'élève O WH rouler <= '70'


trouver une donnée en utilisant la clause where et moins que conditionner

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

SÉLECTIONNEZ * DEPUIS l'élève OERE rouler <'70'



2
Je voulais juste ajouter, puisque votre réponse m'a aidé à trouver ma solution, pour afficher toutes les propriétés sauf _id serait db.student.find({}, {_id:0})Merci pour l'aide.
user8675309

58

Je pense que mattingly890 a la bonne réponse, voici un autre exemple avec le motif / commande

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

entrez la description de l'image ici


pour montrer la sortie de mongo et ce qu'elle retourne comme exemple.
grepit

Mec, tu m'as donné un vote négatif parce que j'avais inclus une capture d'écran dans ma réponse?
grepit

Oui, et aussi parce que je ne vois pas ce que votre réponse apporte de nouveau à la réponse de @therealrootuser
Guillaume Lebreton

10

Voilà, 3 façons de faire, du plus court au plus ennuyeux:

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

Pour supprimer un -opérateur d' utilisation de champ spécifique :

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

1
Je pense que vos commandes mentionnées proviennent de mangouste et non de mongodb sauf la 3e.
Ashish

8

À des fins éducatives, vous pouvez également le faire de l'une des manières suivantes:

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

Essayez la requête suivante:

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

J'espère que cela t'aides!!


pretty () ne sera utile que lors de l'exécution via shell, pas à partir de scripts.
Dinakar

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

Dans votre exemple, vous pouvez faire quelque chose comme:

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

Projection

Le paramètre de projection détermine quels champs sont renvoyés dans les documents correspondants. Le paramètre de projection prend un document de la forme suivante:

{ field1: <value>, field2: <value> ... }
The <value> can be any of the following:
  1. 1 ou true pour inclure le champ dans les documents de retour.

  2. 0 ou faux pour exclure le champ.

REMARQUE

Pour le champ _id, vous n'avez pas besoin de spécifier explicitement _id: 1 pour renvoyer le champ _id. La méthode find () renvoie toujours le champ _id sauf si vous spécifiez _id: 0 pour supprimer le champ.

LIRE LA SUITE


7

Bien que la réponse de gowtham soit complète, il convient de noter que ces commandes peuvent différer d'une API à l'autre (pour celles qui n'utilisent pas le shell de mongo).
Veuillez vous référer au lien de documentation pour des informations détaillées.

Les nœuds , par exemple, ont une méthode appelée `projection que vous ajouteriez à votre fonction find pour projeter.

En suivant le même exemple, des commandes comme les suivantes peuvent être utilisées avec Node:

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

SELECT _id, roll FROM student

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

CHOISISSEZ le rouleau de l'étudiant

etc.

Encore une fois pour les utilisateurs de nodejs, n'oubliez pas (ce que vous devriez déjà savoir si vous avez utilisé cette API auparavant) à utiliser toArraypour ajouter votre .thencommande.


4

Pour une meilleure compréhension, j'ai écrit une requête MySQL similaire.

Selecting specific fields 

MongoDB: db.collection_name.find ({}, {nom: vrai, email: vrai, téléphone: vrai});

MySQL: SELECT nom, email, téléphone FROM nom_table;

Selecting specific fields with where clause

MongoDB: db.collection_name.find ({email:'you@email.com '}, {name: true, email: true, téléphone: true});

MySQL: SELECT nom, email, téléphone FROM nom_table WHERE email = 'you@email.com';


3

Cela fonctionne pour moi,

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

aucune condition dans la clause where, c'est-à-dire à l'intérieur des premières accolades. à l'intérieur des accolades suivantes: liste des noms de champs de projection nécessaires dans le résultat et 1 indique qu'un champ particulier fait partie du résultat de la requête


2

obtenir le nom de l'étudiant

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

obtenir le nom et le rôle de l'étudiant

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

2

La requête pour MongoDB ici frais est la collecte et la description est un champ.

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

1

Si vous souhaitez récupérer le champ "roll" uniquement pour les 10 enregistrements des collections. Alors essayez ceci.

Dans MongoDb:

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

En sql:

sélectionner le rouleau parmi les étudiants


1

Je veux juste ajouter aux réponses que si vous souhaitez afficher un champ imbriqué dans un autre objet, vous pouvez utiliser la syntaxe suivante

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

Ici la clé est présente à l'intérieur de l'objet nommé objet

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

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

Cela équivaut à -

Sélectionner le rouleau de l'élève



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

Cela équivaut à -

Sélectionnez le rôle, nom de l'élève


0

Utilisez la requête comme ceci dans le shell:

1. Utilisezdatabase_name

e.g: use database_name

2. Qui ne retourne que les informations spécifiques aux champs des actifs lorsqu'ils sont mis en correspondance, _id:0spécifie de ne pas afficher l'ID dans le résultat

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

0

Dans mongodb 3.4, nous pouvons utiliser la logique ci-dessous, je ne suis pas sûr des versions précédentes

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

la logique ci-dessus aide à définir certaines colonnes (si elles sont inférieures)


0

En utilisant Studio 3T pour MongoDB, si je l'utilise .find({}, { _id: 0, roll: true })toujours retourner un tableau d'objets avec un vide_id propriété .

L'utilisation de JavaScript mapm'a aidé à récupérer uniquement la rollpropriété souhaitée sous forme de tableau de chaînes:

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

0

Je ne suis pas sûr que cela réponde à la question, mais je pense que cela vaut la peine d'être mentionné ici. Il existe une autre façon de sélectionner un seul champ (et non plusieurs) en utilisantdb.collection_name.distinct();

par exemple,db.student.distinct('roll',{});

Ou, 2e voie: Utilisation db.collection_name.find().forEach(); (plusieurs champs peuvent être sélectionnés ici par concaténation)

par exemple, db.collection_name.find().forEach(function(c1){print(c1.roll);});

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.