MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB - Създаване на връзка

За да създадете връзка в MongoDB, или вградете BSON документ в друг, или го препратете от друг.

Базите данни MongoDB работят по различен начин от релационните бази данни. Това важи и за връзките.

В MongoDB можете да създадете връзка, като използвате един от следните два метода:

  • Вградени документи.
  • Референтни документи.

Методът, който използвате, ще зависи от данните и как възнамерявате да направите заявка за тези данни.

Вградени връзки

С MongoDB можете да вграждате документи в документи. Следователно един документ може да съдържа свои собствени връзки.

Всъщност ние вече създадохме връзка, използвайки този метод, когато за първи път създадохме документ.

Връзка един към един

Връзка едно към едно е мястото, където родителският документ има едно дъщерно, а детето има един родител.

Например бизнес правило може да гласи, че изпълнител може да има само един адрес и че адресът може да принадлежи само на един изпълнител.

Следният код създава връзка едно към едно, вградена в документа.

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

Резултат:

WriteResult({ "nInserted" : 1 })

Връзка един към много

един към много Връзката е, когато родителският документ може да има много дъщерни документи, но дъщерните документи могат да имат само един родителски документ.

И така, друго бизнес правило може да гласи, че един изпълнител може да има много албуми, но албумът може да принадлежи само на един изпълнител.

Изпълнението на следния код ще създаде връзка един към много:

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

Резултат:

WriteResult({ "nInserted" : 1 })

Връзки с препратки към документи

Можете да използвате препратка към документ, за да създадете връзка. Вместо да вграждате дъщерния документ в родителския документ (както направихме по-горе), вие отделяте дъщерния документ в неговия собствен самостоятелен документ.

Така че можем да направим това:

Родителски документ

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

Дъщерни документи

Ще вмъкнем 3 дъщерни документа — по един за всеки член на групата:

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
    }
)

Запитване на връзката

След като поставите горните два документа, можете да използвате $lookup за да извършите ляво външно свързване на двете колекции.

Това, във връзка с aggregate() метод и $match за да посочите конкретния изпълнител, от който се интересувате, ще върне родителски и дъщерни документи в едно.

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

Резултат:

{
	"_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
		}
	]
}

Можете да видите, че първите две полета са от колекцията на художниците, а останалите са от колекцията на музикантите.

Така че, ако правите заявка само за колекцията на художници:

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

Ще получите само това:

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

Не се връщат свързани данни.

Кога да използвате вградени документи срещу препоръчани документи

И двата метода за създаване на взаимоотношения имат своите плюсове и минуси. Понякога може да използвате вградени документи, а друг път ще използвате референтни документи.

Кога да използвате вградени връзки

Едно от основните предимства на използването на метода на вградената връзка е производителността. Когато връзката е вградена в документа, заявките ще се изпълняват по-бързо, отколкото ако са разпределени в множество документи. MongoDB трябва да върне само един документ, вместо да присъединява множество документи, за да извлече връзките. Това може да осигури значително повишаване на производителността — особено при работа с много данни.

Вградените връзки също правят заявките по-лесни за писане. Вместо да пишете сложни заявки, които обединяват много документи чрез техния уникален идентификатор, можете да върнете всички свързани данни в рамките на една заявка.

Друго съображение, което трябва да имате предвид, е, че MongoDB може да гарантира атомарност само на ниво документ. Актуализациите на документ за един документ винаги са атомарни, но не и за множество документи.

Когато няколко потребители имат достъп до данните, винаги има шанс двама или повече потребители да се опитат да актуализират един и същ документ с различни данни. В този случай MongoDB ще гарантира, че няма конфликт и само един набор от данни се актуализира наведнъж. MongoDB не може да гарантира това в множество документи.

Така че като цяло, вградените връзки могат да се използват в повечето случаи, стига документът да остане в рамките на ограничението за размер (16 мегабайта към момента на писане) и/или неговото ограничение за влагане (100 нива дълбоко в момента на писане).

Вградените връзки обаче не са подходящи за всички случаи. Възможно е да има ситуации, в които е по-разумно да се създаде връзка с препратка към документа.

Кога да се използват препоръчани връзки

За данни, които трябва да се повтарят в много документи, може да бъде полезно да ги има в собствен отделен документ. Това може да намали грешките и да помогне за поддържането на последователност на данните (като се има предвид, че актуализациите на множество документи не са атомарни).

Използвайки горния пример, един музикант може да бъде член (или бивш член) на много групи. Някои могат също да произвеждат албуми за други изпълнители, да преподават на студенти, да ръководят клиники и т.н. Също така, много данни могат да се съхраняват срещу всеки музикант. Така че в този случай има смисъл да имате отделен документ за всеки музикант.

Освен това, ако смятате, че вашите вградени документи може да надвишават ограничението за размер на файла, наложено от MongoDB, тогава ще трябва да съхранявате някои данни в отделни документи.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Гарантира ли клаузата $in на MongoDB

  2. Атрибут Mongoengine creation_time в документа

  3. Закръгляване до 2 знака след десетичната запетая с помощта на рамката за агрегиране на MongoDB

  4. Инсталирайте MongoDB Community Edition 4.0 на Linux

  5. MongoDB $ne оператор на конвейер за агрегиране