sql >> Database teknologi >  >> NoSQL >> MongoDB

MongoDB - Opret et forhold

For at oprette en relation i MongoDB skal du enten integrere et BSON-dokument i et andet eller henvise til det fra et andet.

MongoDB-databaser fungerer anderledes end relationelle databaser. Dette gælder også for relationer.

I MongoDB kan du oprette en relation ved at bruge en af ​​følgende to metoder:

  • Indlejrede dokumenter.
  • Refererede dokumenter.

Den metode, du bruger, afhænger af dataene, og hvordan du har til hensigt at forespørge på disse data.

Indlejrede relationer

Med MongoDB kan du integrere dokumenter i dokumenter. Derfor kan et enkelt dokument indeholde sine egne relationer.

Faktisk har vi allerede oprettet en relation ved hjælp af denne metode, da vi først oprettede et dokument.

En-til-en-forhold

Et en-til-en-forhold er, hvor det overordnede dokument har ét barn, og barnet har én forælder.

For eksempel kan en forretningsregel sige, at en kunstner kun kan have én adresse, og at adressen kun kan tilhøre én kunstner.

Følgende kode opretter en en-til-en-relation, indlejret i dokumentet.

db.artists.insert(
    {
        _id : 2,
        artistname : "Prince",
        address :   {
                        street : "Audubon Road",
                        city : "Chanhassen",
                        state : "Minnesota",
                        country : "United States"
                    }
    }
)

Resultat:

WriteResult({ "nInserted" : 1 })

En-til-mange forhold

En en-til-mange relation er, hvor det overordnede dokument kan have mange underordnede dokumenter, men de underordnede dokumenter kan kun have ét overordnet dokument.

Så en anden forretningsregel kan sige, at én kunstner kan have mange album, men et album kan kun tilhøre én kunstner.

Hvis du kører følgende kode, oprettes en en-til-mange-relation:

db.artists.insert(
    {
        _id : 3,
        artistname : "Moby",
        albums : [
                    {
                        album : "Play",
                        year : 1999,
                        genre : "Electronica"
                    }, 
                    {
                        album : "Long Ambients 1: Calm. Sleep.",
                        year : 2016,
                        genre : "Ambient"
                    }
                ]
    }
)

Resultat:

WriteResult({ "nInserted" : 1 })

Dokumenthenviste relationer

Du kan bruge en dokumentreference til at oprette en relation. I stedet for at indlejre det underordnede dokument i det overordnede dokument (som vi gjorde ovenfor), adskiller du det underordnede dokument i sit eget selvstændige dokument.

Så vi kunne gøre dette:

Overordnet dokument

db.artists.insert(
    {
        _id : 4,
        artistname : "Rush"
    }
)

Børnedokumenter

Vi indsætter 3 underordnede dokumenter — et for hvert bandmedlem:

db.musicians.insert(
    {
        _id : 9,
        name : "Geddy Lee",
        instrument : [ "Bass", "Vocals", "Keyboards" ],
        artist_id : 4
    }
)
db.musicians.insert(
    {
        _id : 10,
        name : "Alex Lifeson",
        instrument : [ "Guitar", "Backing Vocals" ],
        artist_id : 4
    }
)
db.musicians.insert(
    {
        _id : 11,
        name : "Neil Peart",
        instrument : "Drums",
        artist_id : 4
    }
)

Forespørgsel efter forholdet

Efter at have indsat de to ovenstående dokumenter, kan du bruge $lookup at udføre en venstre ydre sammenføjning på de to samlinger.

Dette sammen med aggregate() metode og $match for at angive den specifikke kunstner, du er interesseret i, returnerer forældre- og underordnede dokumenter i ét.

db.artists.aggregate([
    {
      $lookup:
        {
          from: "musicians",
          localField: "_id",
          foreignField: "artist_id",
          as: "band_members"
        }
   },
   { $match : { artistname : "Rush" } }
]).pretty()

Resultat:

{
	"_id" : 4,
	"artistname" : "Rush",
	"band_members" : [
		{
			"_id" : 9,
			"name" : "Geddy Lee",
			"instrument" : [
				"Bass",
				"Vocals",
				"Keyboards"
			],
			"artist_id" : 4
		},
		{
			"_id" : 10,
			"name" : "Alex Lifeson",
			"instrument" : [
				"Guitar",
				"Backing Vocals"
			],
			"artist_id" : 4
		},
		{
			"_id" : 11,
			"name" : "Neil Peart",
			"instrument" : "Drums",
			"artist_id" : 4
		}
	]
}

Du kan se, at de to første felter er fra kunstnerens samling, og resten af ​​det er fra musikernes samling.

Så hvis du kun forespørger på kunstnerens samling af sig selv:

db.artists.find( { artistname : "Rush" } )

Du får kun dette:

{ "_id" : 4, "artistname" : "Rush" }

Ingen relaterede data returneres.

Hvornår skal man bruge indlejrede dokumenter vs. refererede dokumenter

Begge metoder til at skabe relationer har deres fordele og ulemper. Nogle gange bruger du måske indlejrede dokumenter, og andre gange bruger du refererede dokumenter.

Hvornår skal du bruge Embedded Relationships

En af de vigtigste fordele ved at bruge den indlejrede relationsmetode er ydeevne. Når relationen er indlejret i dokumentet, vil forespørgsler køre hurtigere, end hvis de var spredt ud over flere dokumenter. MongoDB behøver kun at returnere det ene dokument i stedet for at forbinde flere dokumenter for at hente relationerne. Dette kan give et væsentligt løft af ydeevnen - især når du arbejder med masser af data.

Indlejrede relationer gør også forespørgsler nemmere at skrive. I stedet for at skrive komplekse forespørgsler, der forbinder mange dokumenter via deres unikke identifikator, kan du returnere alle relaterede data inden for en enkelt forespørgsel.

En anden overvejelse at huske på er, at MongoDB kun kan sikre atomicitet på dokumentniveau. Dokumentopdateringer til et enkelt dokument er altid atomare, men ikke for flere dokumenter.

Når flere brugere har adgang til dataene, er der altid en chance for, at to eller flere brugere vil forsøge at opdatere det samme dokument med forskellige data. I dette tilfælde vil MongoDB sikre, at der ikke opstår konflikt, og kun ét sæt data opdateres ad gangen. MongoDB kan ikke sikre dette på tværs af flere dokumenter.

Så generelt kan indlejrede relationer bruges i de fleste tilfælde, så længe dokumentet forbliver inden for størrelsesgrænsen (16 megabyte i skrivende stund) og/eller dets indlejringsgrænse (100 niveauer dybt i skrivende stund).

Indlejrede relationer er dog ikke passende for alle lejligheder. Der kan være situationer, hvor det giver mere mening at oprette en dokumentreferencerelation.

Hvornår skal refererede relationer bruges

For data, der skal gentages på tværs af mange dokumenter, kan det være nyttigt at have dem i deres eget separate dokument. Dette kan reducere fejl og hjælpe med at holde dataene konsistente (og samtidig huske på, at opdateringer af flere dokumenter ikke er atomare).

Ved at bruge ovenstående eksempel kan en musiker være medlem (eller tidligere medlem) af mange bands. Nogle producerer måske også albums til andre kunstnere, underviser studerende, driver klinikker osv. Der kan også lagres en masse data mod hver musiker. Så at have et separat dokument for hver musiker giver mening i dette tilfælde.

Hvis du også mener, at dine indlejrede dokumenter kan overskride filstørrelsesgrænsen pålagt af MongoDB, så bliver du nødt til at gemme nogle data i separate dokumenter.


  1. Redis - Brug af CONFIG SET på farten i et master-slave-forhold

  2. RuntimeWarning:Du kører arbejderen med superbrugerrettigheder:dette anbefales absolut ikke

  3. Hvordan kan jeg bruge redis med Django?

  4. Node.js, Mongo finder og returnerer data