MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB findOne()

In MongoDB die db.collection.findOne() -Methode gibt ein Dokument zurück, das die angegebenen Abfragekriterien für die Sammlung oder Ansicht erfüllt.

Die collection part ist der Name der zu durchsuchenden Sammlung oder Ansicht.

findOne() ist ähnlich wie find() , außer dass findOne() gibt nur das erste Dokument zurück, das den Filterkriterien entspricht, gemäß der natürlichen Reihenfolge, die die Reihenfolge der Dokumente auf der Festplatte widerspiegelt.

Das find() -Methode hingegen gibt alle übereinstimmenden Dokumente zurück.

Auch findOne() gibt das eigentliche Dokument zurück, während find() gibt nur einen Cursor zu jedem Dokument zurück. Daher können Sie keine Cursormethoden auf findOne() anwenden wie Sie es mit find() können .

Beispiel

Angenommen, wir haben eine Sammlung namens pets mit folgenden Dokumenten:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }{ "_id" :2, "name" :"Bark", "type" :„Hund“, „Gewicht“ :10 }{ „_id“ :3, „Name“ :„Miau“, „Typ“ :„Katze“, „Gewicht“ :7 }{ „_id“ :4, „Name“ :„Scratch“, „type“ :„Cat“, „weight“ :8 }{ „_id“ :5, „name“ :„Bruce“, „type“ :„Bat“, „weight“ :3 } 

Wir können findOne() verwenden um ein Dokument zurückzugeben.

db.pets.findOne() 

Ergebnis:

{ "_id" :1, "name" :"Wag", "type" :"Hund", "weight" :20 }

Hier haben wir alle Dokumente in den pets durchsucht Sammlung. Wir wissen, dass alle Dokumente durchsucht wurden, weil wir keine Filterkriterien angegeben haben. Wir haben nicht einmal Argumente geliefert.

Wenn ohne Argumente aufgerufen, findOne() durchsucht alle Dokumente aus einer Sammlung und gibt alle Felder für das passende Dokument zurück.

Eine andere Möglichkeit, das Obige zu tun, ist wie folgt:

db.pets.findOne({}) 

In diesem Fall übergeben wir ein leeres Dokument.

Durch Hinzufügen zu diesem leeren Dokument können wir mit dem Filtern der Ergebnisse beginnen.

Geben Sie eine Abfrage ein

Die eigentliche Syntax von findOne() geht so:

db.collection.findOne(query, projection) 

Das bedeutet, dass Sie als erstes Argument eine Abfrage und als zweites eine Projektion übergeben können.

Wenn Sie eine Abfrage übergeben, wird sie verwendet, um den Umfang der Suche auf nur die Dokumente zu filtern, die der Abfrage entsprechen. Eine Abfrage ist ein Dokument, das Abfrageoperatoren enthält. Wie wir im vorherigen Beispiel gesehen haben, gibt ein leeres Dokument alle Dokumente zurück.

Lassen Sie uns die Ergebnisse auf eine Teilmenge von Dokumenten in der Sammlung eingrenzen.

db.pets.findOne({"type":"Cat"}) 

Ergebnis:

{ "_id" :3, "name" :"Miau", "type" :"Cat", "weight" :7 }

Dadurch wurde die Suche auf nur die Dokumente eingegrenzt, die einen type haben Feld mit dem Wert Cat , dann findOne() gab das erste Dokument aus diesem Ergebnis zurück.

In diesem Fall haben wir einfach ein Dokument als Filterkriterium übergeben.

Sie können auch Abfrageoperatoren verwenden. Diese ermöglichen es Ihnen, spezifischere Kriterien auf Ihre Abfrage anzuwenden.

Beispiel:

db.pets.findOne({"weight": { $lt: 10 }}) 

Ergebnis:

{ "_id" :3, "name" :"Miau", "type" :"Cat", "weight" :7 }

Eingebettete Dokumente

Wenn Sie Dokumente haben, die eingebettete Dokumente enthalten, können Sie die folgenden Methoden verwenden, um Daten in den eingebetteten Dokumenten abzufragen.

  • Punktnotation (z. B. field.nestedfield: <value> )
  • Verschachtelte Form (z. B. { field: { nestedfield: <value> } } ). Beachten Sie, dass diese Option erst ab MongoDB 4.4 verfügbar ist.

Angenommen, wir fügen das folgende Dokument ein.

db.pets.insertOne({ "_id" :6, "name" :"Fetch", "type" :"Dog", "specs" :{ "height" :400, "weight" :15, " Farbe" :"braun" }})

Wir können die Punktnotation verwenden, um innerhalb des eingebetteten Dokuments abzufragen.

db.pets.findOne({ "specs.height": 400 }) 

Ergebnis:

{ "_id" :6, "name" :"Fetch", "type" :"Hund", "specs" :{ "height" :400, "weight" :15, "color" :"brown" }}

Die folgende Abfrage gibt dasselbe Dokument zurück, außer dass wir dieses Mal das eingebettete Dokument in verschachtelter Form referenzieren.

db.pets.findOne({ 
    "specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
 }) 

Ergebnis:

{ "_id" :6, "name" :"Fetch", "type" :"Hund", "specs" :{ "height" :400, "weight" :15, "color" :"brown" }}

Bei Verwendung des verschachtelten Formulars muss die Abfrage genau mit dem gesamten eingebetteten Dokument übereinstimmen. Die folgende Abfrage stimmt beispielsweise nicht überein:

db.pets.findOne({ 
    "specs" : {
		"height" : 400
	}
 }) 

Ergebnis:

null

Arrays

Sie können Daten in Arrays referenzieren, indem Sie das Array-Element über seinen Index oder seinen Wert referenzieren.

Angenommen, wir fügen das folgende Dokument ein:

db.pets.insertOne({ "_id" :7, "name" :"Jake", "type" :"Dog", "awards" :[ "Top Dog", "Best Dog", "Größter Hund " ]})

Wenn wir alle Hunde mit der Top-Hund-Auszeichnung finden wollten, könnten wir die folgende Abfrage schreiben (die den obigen Hund zurückgibt).

db.pets.findOne({ 
    "awards": "Top Dog"
}) 

Ergebnis:

{ "_id" :7, "name" :"Jake", "type" :"Hund", "Auszeichnungen" :[ "Platzhirsch", "Bester Hund", "Größter Hund" ]}

Sie können den Elementindex auch wie folgt angeben:

db.pets.findOne({ 
    "awards.0": "Top Dog"
}) 

Dazu muss sich der angegebene Wert am angegebenen Index befinden. Daher gibt die folgende Abfrage nicht denselben Hund zurück.

db.pets.findOne({ 
    "awards.1": "Top Dog"
}) 

Beachten Sie, dass Arrays nullbasiert sind, sodass ein Index von 0 das erste Element angibt, 1 das zweite Element und so weiter.

Projektionen

Standardmäßig werden alle Dokumentfelder zurückgegeben, wenn Sie findOne() verwenden . Sie können jedoch Projektionen verwenden, um die Anzahl der zurückgegebenen Felder bei Bedarf zu reduzieren.

Sie erinnern sich vielleicht, dass die Syntax für findOne() geht so:

db.collection.findOne(query, projection) 

Wobei query liefert die Filterkriterien (die wir in den obigen Beispielen gemacht haben) und projection ist eine optionale Projektion, die angibt, welche Felder von übereinstimmenden Dokumenten zurückgegeben werden sollen. Wenn wir also eine Projektion verwenden wollen, stellen wir sie einfach hinter die Abfrage.

Wenn Sie eine Projektion verwenden, können Sie die einzuschließenden Felder angeben , die Felder, die ausgeschlossen werden sollen , oder beides. Listen Sie dazu den Namen des Feldes und entweder eine 1 auf (um es einzuschließen) oder 0 (um es auszuschließen).

Hier ist ein Beispiel für die Verwendung einer Projektion zur Angabe der einzuschließenden Felder:

db.pets.findOne({}, { name: 1, type: 1 }) 

Ergebnis:

{ "_id" :1, "name" :"Wag", "type" :"Hund" }

Beachten Sie, dass die _id Das Feld wird zurückgegeben, obwohl wir es nicht in unsere Projektion aufgenommen haben. Dieses Feld ist eine Ausnahme und standardmäßig enthalten.

Wenn Sie die _id nicht möchten Feld zurückgegeben werden soll, müssen Sie es explizit ausschließen.

db.pets.findOne({}, { _id: 0, name: 1, type: 1 }) 

Ergebnis:

{ "name" :"Wag", "type" :"Hund" }

Hier ist ein weiteres Beispiel, diesmal geben wir nur an, welche Felder ausgeschlossen werden sollen.

db.pets.findOne({}, { _id: 0, weight: 0, specs: 0, awards: 0 }) 

Ergebnis:

{ "name" :"Wag", "type" :"Hund" }

Mehr Projektionen

Es gibt verschiedene andere Dinge, die Sie mit Projektionen tun können. Beispielsweise können Sie ab MongDB 4.4 Aggregatausdrücke verwenden, um den Wert eines projizierten Felds anzugeben.

Beispiel:

db.pets.findOne({}, { 
    "_id": 0,
    "n": "$name", 
    "t": "$type", 
    "w": "$weight" 
    }) 

Ergebnis:

{ "n" :"Wag", "t" :"Hund", "w" :20 }

Hier haben wir die Feldnamen umbenannt. Wir haben dies getan, indem wir für jedes Feld einen neuen Namen als String-Literal angegeben haben, und zwar unter Verwendung von $fieldName Syntax, um diesen Feldwert auszugeben. Das Ergebnis ähnelt ein wenig der Verwendung von Aliasnamen in SQL.

Weitere Informationen

Weitere Informationen finden Sie in der MongoDB-Dokumentation.