397 Stimmen

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

In meinem MongoDB habe ich eine Schülerkollektion mit 10 Datensätzen, die die Felder name und roll haben. Ein Datensatz dieser Kollektion ist:

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

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

SELECT roll FROM student

Ich habe viele Blogs durchgesehen, aber alle führen zu einer Abfrage, die eine WHERE-Klausel haben muss, zum Beispiel:

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

Die Abfrage ist äquivalent zu:

SELECT * FROM student WHERE roll > 70

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

2voto

PrabhuPrakash Punkte 231

Name des Schülers abrufen

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

Name und Rollen des Schülers abrufen

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

2voto

Gandalf the White Punkte 2327

Abgesehen von dem, was die Leute bereits erwähnt haben, führe ich nur Indizes in die Mischung ein.

Stellen Sie sich also eine große Sammlung vor, mit sagen wir über 1 Million Dokumenten, und Sie müssen eine Abfrage wie diese ausführen.

Der interne Cache von WiredTiger muss all diese Daten im Cache behalten, wenn Sie diese Abfrage darauf ausführen müssen. Andernfalls werden diese Daten entweder aus dem FS-Cache oder von der Festplatte in den WT-Internen Cache eingespeist, bevor der Abruf aus der DB erfolgt (chargenweise, wenn dieser von einem Treiber abgerufen wird, der mit der Datenbank verbunden ist, und vorausgesetzt, dass 1 Million Dokumente nicht auf einmal zurückgegeben werden, wenn ein Cursor ins Spiel kommt).

Abgedeckte Abfrage kann eine Alternative sein. Kopieren Sie den Text direkt aus Dokumentation.

Wenn ein Index eine Abfrage abdeckt, kann MongoDB sowohl die Abfragebedingungen erfüllen als auch die Ergebnisse nur mit den Indexschlüsseln zurückgeben; d.h. MongoDB muss keine Dokumente aus der Sammlung untersuchen, um die Ergebnisse zurückzugeben.

Wenn ein Index eine Abfrage abdeckt, hat das Erklärungsergebnis eine IXSCAN-Phase, die nicht von einer FETCH-Phase abstammt, und in den executionStats ist totalDocsExamined 0.

Abfrage: db.getCollection('qaa').find({roll_no : {$gte : 0}},{_id : 0, roll_no : 1})

Index: db.getCollection('qaa').createIndex({roll_no : 1})

Wenn der Index hier im WT-Internen Cache liegt, kann dies ein einfacher Prozess sein, um die Werte zu erhalten. Ein Index wirkt sich auf die Schreibleistung des Systems aus, daher würde dies mehr Sinn ergeben, wenn die Lesevorgänge im Vergleich zu den Schreibvorgängen häufiger sind.

2voto

rohit mali Punkte 29
 var sammlung = db.sammlung('appuser');
    sammlung.aggregieren(
      { $project : { vorname : 1, nachname : 1 } },function(err, res){
        res.toArray(function(err, realRes){
          console.log("Antwort roo==>",realRes);
        });
      });  
  • es funktioniert

2voto

samsri Punkte 994

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

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

Hier ist der Schlüssel im Objekt namens Objekt vorhanden

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

1voto

Biju Maharjan Punkte 429

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

In MongoDb:

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

In Sql:

select roll from students

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X