sql >> Database >  >> NoSQL >> MongoDB

MongoDB - Een verzameling opvragen

MongoDB biedt de db.collection.find() methode om documenten binnen een verzameling op te vragen.

De db.collection.find() selecteert documenten in een verzameling en brengt een cursor terug naar de geselecteerde documenten.

Alle documenten retourneren

Dit voorbeeld retourneert alle documenten van de muzikanten collectie:

db.musicians.find()

Resultaat:

{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
{ "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
{ "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 }
{ "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 }
{ "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 }
{ "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 }
{ "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 }
{ "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }

Het retourneert alle documenten omdat we geen parameters hebben doorgegeven als filtercriteria.

De bovenstaande zoekopdracht is een verkorte versie van db.musicians.find( {} ) . In de bovenstaande zoekopdracht hebben we de accolades weggelaten {} . Dit is perfect geldig bij het werken met MongoDB.

Filtercriteria toevoegen

U kunt de resultaten filteren door alleen de criteria op te geven waarin u geïnteresseerd bent.

Als we bijvoorbeeld alleen geïnteresseerd zijn in Deep Purple van de artiesten collectie:

db.artists.find({ artistname : "Deep Purple" })

Resultaat:

{ "_id" : ObjectId("5781f85d48ef8c6b3ffb0150"), "artistname" : "Deep Purple", "albums" : [ { "album" : "Machine Head", "year" : 1972, "genre" : "Rock" }, { "album" : "Stormbringer", "year" : 1974, "genre" : "Rock" } ] }

Maak de resultaten op

Mogelijk vindt u de bovenstaande resultaten een beetje moeilijk te lezen. Het document wordt geretourneerd als één lange regel tekst.

U kunt de pretty() . gebruiken methode om de resultaten op te maken zodat ze een beetje gemakkelijker te lezen zijn.

Voeg gewoon pretty() toe tot het einde, zoals dit:

db.artists.find({ artistname : "Deep Purple" }).pretty()

Resultaat:

{
	"_id" : ObjectId("5781f85d48ef8c6b3ffb0150"),
	"artistname" : "Deep Purple",
	"albums" : [
		{
			"album" : "Machine Head",
			"year" : 1972,
			"genre" : "Rock"
		},
		{
			"album" : "Stormbringer",
			"year" : 1974,
			"genre" : "Rock"
		}
	]
}

Meer filteropties

Hier zijn nog enkele manieren om resultaten te filteren.

Specificeer AND Voorwaarden

U kunt specificeren dat alleen documenten met twee of meer gespecificeerde waarden moeten worden geretourneerd.

In dit voorbeeld specificeren we dat alleen muzikanten die drummen en waar geboren vóór 1950 moeten worden teruggegeven. Alleen documenten die aan beide criteria voldoen, worden geretourneerd.

db.musicians.find( { instrument: "Drums", born: { $lt: 1950 } } )

Resultaat:

{ "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }

Specificeer OR Voorwaarden

U kunt ook opgeven dat de ene of de andere waarde waar moet zijn. Zolang een van de voorwaarden waar is, wordt het document geretourneerd.

In dit voorbeeld willen we documenten die muzikanten bevatten die ofwel drums spelen, ofwel geboren zijn vóór 1950.

db.musicians.find(
   {
     $or: [ { instrument: "Drums" }, { born: { $lt: 1950 } } ]
   }
)

Resultaat:

{ "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
{ "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 }
{ "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 }
{ "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 }

De $in Operator

De $in operator kunt u een lijst met waarden opgeven. Als een document een van deze waarden bevat, wordt het geretourneerd.

Aan de hand van het volgende voorbeeld zoeken we naar alle muzikanten die ofwel zang ofwel gitaar spelen.

db.musicians.find( { instrument: { $in: [ "Vocals", "Guitar" ] } } )

Resultaat

{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
{ "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 }
{ "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 }

Een array van documenten opvragen

In dit voorbeeld wordt een reeks documenten opgevraagd. Het vindt albums die na het jaar 2000 zijn uitgebracht.

db.artists.find(
   {
      albums: {
                $elemMatch: {
                     year: { $gt: 2000 }
                }
      }
   }
).pretty()

Resultaat:

{
	"_id" : ObjectId("578217c248ef8c6b3ffb015a"),
	"artistname" : "Robben Ford",
	"albums" : [
		{
			"album" : "Bringing it Back Home",
			"year" : 2013,
			"genre" : "Blues"
		},
		{
			"album" : "Talk to Your Daughter",
			"year" : 1988,
			"genre" : "Blues"
		}
	]
}
{
	"_id" : ObjectId("578217c248ef8c6b3ffb015b"),
	"artistname" : "Snoop Dogg",
	"albums" : [
		{
			"album" : "Tha Doggfather",
			"year" : 1996,
			"genre" : "Rap"
		},
		{
			"album" : "Reincarnated",
			"year" : 2013,
			"genre" : "Reggae"
		}
	]
}

U zult zien dat deze resultaten ook albums van eerder dan 2000 bevatten. Dit is correct - het is de manier waarop documentgeoriënteerde databases werken. Elke query retourneert het hele document (maar alleen die documenten die voldoen aan de opgegeven criteria).

De db.collection.findOne() Methode

U kunt de db.collection.findOne() . gebruiken methode om één document te retourneren dat voldoet aan de opgegeven zoekcriteria.

Als meerdere documenten aan de criteria voldoen, wordt alleen de eerste geretourneerd, zoals bepaald door de natuurlijke volgorde van de documenten op schijf.

Dus doorzoek een hele collectie als volgt:

db.musicians.findOne( )

Stuurt slechts één document terug:

{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }

Als we de findOne() naar find() zoals dit:

db.musicians.find( )

We zien dat er eigenlijk 8 documenten in de collectie zitten:

{ "_id" : 1, "name" : "Ian Gillan", "instrument" : "Vocals" }
{ "_id" : 2, "name" : "Ian Paice", "instrument" : "Drums", "born" : 1948 }
{ "_id" : 3, "name" : "Roger Glover", "instrument" : "Bass", "born" : 1945 }
{ "_id" : 4, "name" : "Steve Morse", "instrument" : "Guitar", "born" : 1954 }
{ "_id" : 5, "name" : "Don Airey", "instrument" : "Keyboards", "born" : 1948 }
{ "_id" : 6, "name" : "Jeff Martin", "instrument" : "Vocals", "born" : 1969 }
{ "_id" : 7, "name" : "Jeff Burrows", "instrument" : "Drums", "born" : 1968 }
{ "_id" : 8, "name" : "Stuart Chatwood", "instrument" : "Bass", "born" : 1969 }

  1. Hoe vraag je *juist* Redis van Tornado?

  2. Hoe de prestaties van ClusterControl en zijn componenten te optimaliseren

  3. Kubernetes NFS-opslag met behulp van PV en PVC

  4. MongoDB select count (distinct x) op een geïndexeerde kolom - tel unieke resultaten voor grote datasets