sql >> Databáze >  >> NoSQL >> MongoDB

Jak byste modelovali přátelský vztah v MongoDB?

MongoDB se obecně nehodí pro modelování vztahů v grafech. Existují specializované databáze grafů, které v tomto úkolu vynikají.

Pokud však nechcete do mixu přidávat další databázovou technologii, doporučil bych vytvořit novou kolekci frienships a modelujte každý vztah s přáteli jako dokument s polem dvou položek, z nichž každá je objektem se zkrácenými informacemi o jednom z uživatelů, které potřebujete k zobrazení položky ve svých seznamech přátel:

{
    friendship: [
       {
            id:123,
            name: "Bob",
            avatar: "Bob.jpg"
       },
       {
            id:456,
            name: "Alice",
            avatar: "Alice.jpg"
       }
    ]
}

Důvodem duplikování informací z uživatelských dokumentů v dokumentech přátelství je vyhnout se druhému dotazu na kolekci uživatelů za účelem získání všech dat pro zobrazení seznamu přátel uživatelů. MongoDB nemůže dělat JOINy může provádět JOIN pouze u neskartovaných sbírek , takže byste se měli vyvarovat šíření dat, která potřebujete pro konkrétní případ použití, do více kolekcí, i když to znamená, že vytváříte redundanci. Jinak byste museli provádět více dotazů jeden po druhém, což výrazně zpomaluje dobu odezvy vaší aplikace.

Když chcete získat seznam přátel uživatele 123, provedli byste db.friendships.find({"friendship.id", 123}) (index na friendship.id zlepší výkon) a poté obdrží seznam dokumentů, kde je Bob prvním nebo druhým přítelem.

Poté byste tyto dokumenty opakovali a vypsali byste krátké informace o vstupu pole, které není uživatel 123.

Případně můžete odfiltrovat položky Bob v databázi pomocí agregačního kanálu. Použijte výše uvedený dotaz $match, $rozviňte pole přátelství a poté $match ty dokumenty, kde id není 123. To by byl kompromis:Šetříte šířku pásma na úkor zatížení procesoru na databázovém serveru.

Chcete-li se zeptat, zda již existuje přátelství, použijte:

db.friendships.find( { $and: [ 
       { "friendship.id": 123 }, 
       { "friendship.id": 456 } 
    ] } ).count();



  1. Čtení dat z Redis na Flink

  2. Export modulu databáze mongoose

  3. Problém s výkonem plánovače souběžnosti golang + redis

  4. Jak použít mongoimport k importu csv