Wie wähle ich ein einzelnes Feld für alle Dokumente in einer MongoDB-Sammlung aus?

223

In meiner MongoDB habe ich eine Studentensammlung mit 10 Datensätzen mit Feldern nameund roll. Eine Aufzeichnung dieser Sammlung ist:

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

Ich möchte das Feld rollnur für alle 10 Datensätze in der Sammlung abrufen, wie wir es in einer herkömmlichen Datenbank tun würden, indem wir Folgendes verwenden:

SELECT roll FROM student

Ich habe viele Blogs durchgesehen, aber alle führen zu einer Abfrage, die eine WHEREKlausel enthalten muss, zum Beispiel:

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

Die Abfrage entspricht:

SELECT * FROM student WHERE roll > 70

Meine Anforderung ist es, nur einen einzigen Schlüssel ohne Bedingung zu finden. Also, was ist die Abfrageoperation dafür.

Shipra Swati
quelle
@NeilLunn Danke für den Link SQL zu MongoDB Mapping . Ich weiß nicht, wie ich das verpasst habe.
Shipra Swati

Antworten:

255

Aus den MongoDB-Dokumenten :

Eine Projektion kann explizit mehrere Felder enthalten. In der folgenden Operation gibt die find () -Methode alle Dokumente zurück, die der Abfrage entsprechen. In der Ergebnismenge werden nur die Felder item und qty sowie standardmäßig das Feld _id in den übereinstimmenden Dokumenten zurückgegeben.

db.inventory.find ({Typ: 'Essen'}, {Artikel: 1, Menge: 1})

In diesem Beispiel von den Leuten bei Mongo, werden die zurückgegebenen Dokumente enthalten nur die Felder item, qtyund _id.


Daher sollten Sie in der Lage sein, eine Erklärung abzugeben wie:

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

Die obige Anweisung wählt alle Dokumente in der Schülersammlung aus, und das zurückgegebene Dokument gibt nur das rollFeld zurück (und schließt das aus _id).

Wenn wir nicht erwähnen, werden _id:0die zurückgegebenen Felder rollund sein _id. Das Feld '_id' wird standardmäßig immer angezeigt. Also müssen wir explizit _id:0zusammen mit erwähnen roll.

therealrootuser
quelle
9
Kann Google nicht scheinen, also einen Versuch wert. Müssen Sie alle Felder, die Sie nicht möchten, explizit ausschließen? Angenommen, Sie möchten nur ein Feld, aber das Dokument enthält 10, die Sie explizit 0für 9 festlegen müssen? Edit: Nevermind, außer _iddh {field_I_want:1, _id:0}scheint zu funktionieren
Karl Tryggvason
Ist es möglich, ein Feld hinzuzufügen und das Dokument dann zu aktualisieren, wenn ich Projektionen verwende?
Chovy
3
In keiner der Antworten wird tatsächlich Folgendes erwähnt: Hinweis: With the exception of the _id field, you cannot combine inclusion and exclusion statements in projection documents.Dies könnte für einige von Ihnen interessant sein. ( Quelle )
user0800
137

Holen Sie sich alle Daten aus der Tabelle

db.student.find({})

SELECT * FROM student


Holen Sie sich alle Daten aus der Tabelle ohne _id

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

SELECT Name, Rolle FROM Student


Holen Sie sich alle Daten aus einem Feld mit _id

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

ID AUSWÄHLEN, VON Schüler rollen


Holen Sie sich alle Daten aus einem Feld ohne _id

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

SELECT roll FROM student


Finden Sie bestimmte Daten mit der where-Klausel

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

SELECT * FROM Studenten WHERE roll = '80'


Suchen Sie Daten mit der where-Klausel und größer als die Bedingung

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

SELECT * FROM student WHERE roll> '70'


Suchen Sie Daten mit der where-Klausel und größer oder gleich der Bedingung

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

SELECT * FROM student WHERE roll> = '70'


Suchen Sie Daten mit der where-Klausel und der Bedingung kleiner oder gleich

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

SELECT * FROM student WHERE roll <= '70'


Finden Sie Daten mit der where-Klausel und weniger als zur Bedingung

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

SELECT * FROM student WHERE roll <'70'


Gowtham Sooryaraj
quelle
2
Ich wollte nur hinzufügen, da Ihre Antwort mir geholfen hat, meine Lösung herauszufinden, alle Eigenschaften außer _id anzuzeigen. Vielen db.student.find({}, {_id:0})Dank für die Hilfe.
user8675309
58

Ich denke, mattingly890 hat die richtige Antwort, hier ist ein weiteres Beispiel zusammen mit dem Muster / Befehl

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

Geben Sie hier die Bildbeschreibung ein

grepit
quelle
um die Ausgabe von Mongo zu zeigen und was es als Beispiel zurückgibt.
Grepit
Alter, hast du mich abgelehnt, weil ich einen Screenshot in meine Antwort aufgenommen habe?
Grepit
Ja, und auch, weil ich nicht sehe, was Ihre Antwort neu aus @therealrootusers Antwort bringt
Guillaume Lebreton
10

Los geht's, 3 Möglichkeiten, am kürzesten bis langweilig:

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

So entfernen Sie ein bestimmtes Feld: Verwenden Sie den -Operator:

db.student.find({}).select('roll -_id') // <--- Will remove id from result
Vivek Doshi
quelle
1
Ich denke, Ihre erwähnten Befehle stammen von Mungo und nicht von Mongodb außer dem dritten.
Ashish
8

Nur zu Bildungszwecken können Sie dies auch auf eine der folgenden Arten tun:

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

Versuchen Sie die folgende Abfrage:

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

Hoffe das hilft!!

Karan Khanna
quelle
Pretty () ist nur nützlich, wenn es über eine Shell ausgeführt wird, nicht über Skripte.
Dinakar
7

Während Gowtham Antwort abgeschlossen ist, ist es erwähnenswert, dass diese Befehle von über API zu einem anderen (für diejenigen , die nicht - Shell Mongo) unterscheiden.
Weitere Informationen finden Sie unter Dokumentationslink .

Nodejs haben beispielsweise eine Methode namens "Projektion", die Sie an Ihre Suchfunktion anhängen würden, um sie zu projizieren.

Nach dem gleichen Beispielsatz können Befehle wie die folgenden mit Node verwendet werden:

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

SELECT _id, roll FROM student

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

SELECT roll FROM student

und so weiter.

Vergessen Sie auch für Benutzer von nodejs nicht (was Sie bereits kennen sollten, wenn Sie diese API zuvor verwendet haben), toArrayum Ihren .thenBefehl anzuhängen .

Lächelnd
quelle
6
db.<collection>.find({}, {field1: <value>, field2: <value> ...})

In Ihrem Beispiel können Sie Folgendes tun:

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

Projektion

Der Projektionsparameter bestimmt, welche Felder in den übereinstimmenden Dokumenten zurückgegeben werden. Der Projektionsparameter hat ein Dokument in der folgenden Form:

{ field1: <value>, field2: <value> ... }
The <value> can be any of the following:
  1. 1 oder true, um das Feld in die Rücksendeunterlagen aufzunehmen.

  2. 0 oder false, um das Feld auszuschließen.

HINWEIS

Für das Feld _id müssen Sie _id: 1 nicht explizit angeben, um das Feld _id zurückzugeben. Die find () -Methode gibt immer das Feld _id zurück, es sei denn, Sie geben _id: 0 an, um das Feld zu unterdrücken.

WEITERLESEN

Anthony Awuley
quelle
4

Zum besseren Verständnis habe ich eine ähnliche MySQL-Abfrage geschrieben.

Selecting specific fields 

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

MySQL: SELECT Name, E-Mail, Telefon FROM Tabellenname;

Selecting specific fields with where clause

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

MySQL: SELECT Name, E-Mail, Telefon FROM Tabellenname WHERE email = '[email protected]';

Hasib Kamal
quelle
3

Das funktioniert bei mir,

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

Keine Bedingung in der Where-Klausel, dh innerhalb der ersten geschweiften Klammern. in den nächsten geschweiften Klammern: Liste der Projektionsfeldnamen, die im Ergebnis benötigt werden, und 1 gibt an, dass ein bestimmtes Feld Teil des Abfrageergebnisses ist

Aishwarya Panchal
quelle
2

Namen des Schülers bekommen

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

Name & Rolle des Schülers bekommen

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

Die Abfrage für MongoDB hier Gebühren ist Sammlung und Beschreibung ist ein Feld.

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

Wenn Sie das Feld "roll" nur für alle 10 Datensätze in den Sammlungen abrufen möchten. Dann versuchen Sie dies.

In MongoDb:

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

In SQL:

Wählen Sie die Rolle der Schüler aus

Biju Maharjan
quelle
1

Ich möchte nur zu den Antworten hinzufügen, dass Sie die folgende Syntax verwenden können, wenn Sie ein Feld anzeigen möchten, das in einem anderen Objekt verschachtelt ist

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

Hier befindet sich der Schlüssel im Objekt mit dem Namen object

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

Dies entspricht -

Wählen Sie Rolle vom Schüler



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

Dies entspricht -

Wählen Sie Rolle, Name vom Schüler

Rito
quelle
0

Verwenden Sie die Abfrage wie folgt in der Shell:

1. Verwenden Siedatabase_name

e.g: use database_name

2. Wenn beim Abgleich nur bestimmte Feldinformationen für Assets zurückgegeben werden, wird _id:0angegeben, dass die ID im Ergebnis nicht angezeigt wird

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

In Mongodb 3.4 können wir die folgende Logik verwenden, ich bin mir nicht sicher über frühere Versionen

wähle roll von student ==> db.student.find (! {}, {roll: 1})

Die obige Logik hilft beim Definieren einiger Spalten (wenn sie kleiner sind).

Pulla
quelle
0

Wenn ich Studio 3T für MongoDB verwende, wird bei Verwendung .find({}, { _id: 0, roll: true })immer noch ein Array von Objekten mit einer leeren _idEigenschaft zurückgegeben.

Die Verwendung von JavaScript maphat mir geholfen, nur die gewünschte rollEigenschaft als Array von Zeichenfolgen abzurufen :

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

Ich bin mir nicht sicher, ob dies die Frage beantwortet, aber ich glaube, dass es hier erwähnenswert ist. Es gibt noch eine Möglichkeit, ein einzelnes Feld (und nicht mehrere) mit auszuwählendb.collection_name.distinct();

z.B,db.student.distinct('roll',{});

Oder 2. Weg: Verwenden db.collection_name.find().forEach();(mehrere Felder können hier durch Verkettung ausgewählt werden)

z.B, db.collection_name.find().forEach(function(c1){print(c1.roll);});

Ashish
quelle