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

editace dílčích dokumentů N-N vztah v mongodb

Na základě informací, které jste poskytli, bych doporučil dva možné přístupy, vycházející ze stejného základu:

Tento přístup bych doporučil, pokud:

  • Máte vysokou mohutnost jak dokumentů článků, tak platforem
  • Chcete mít možnost spravovat obě entity nezávisle a zároveň mezi nimi synchronizovat reference

    // articles collection schema
    {
    "_id": ...,
    "title": "I am an article",
    
    ...
    
    "platforms": [ "platform_1", "platform_2", "platform_3" ],
    ...
    }
    
    
    // platforms collection schema    
    {
    "_id": "platform_1",
    "name": "Platform 1",
    "url": "http://right/here",
    ...
    },
    
    {
    "_id": "platform_2",
    "name": "Platform 2",
    "url": "http://right/here",
    ...
    },
    
    {
    "_id": "platform_3",
    "name": "Platform 3",
    "url": "http://right/here",
    ...
    }
    

I když je tento přístup poměrně flexibilní, něco stojí – pokud požadujete jak data článku, tak data platformy, budete muset na svou instanci MongoDB zadávat více dotazů, protože data jsou rozdělena do dvou různých kolekcí.

Například při načítání stránky s článkem, uvážíte-li, že chcete také zobrazit seznam platforms , budete muset spustit dotaz na articles collection a poté také spustit vyhledávání v platforms collection k načtení všech entit platformy, na kterých je tento článek publikován, prostřednictvím členů platform s pole v article document .

Pokud však máte pouze malou podmnožinu často používaných platform attributes který potřebujete mít k dispozici při načítání article document , můžete vylepšit platform pole v articles collection k uložení těchto atributů kromě _id odkaz na dokumenty platformy:

// enhanced articles collection schema  
{
"_id": ...,
"title": "I am an article",

...

"platforms": [
    {platform_id: "platform_1", name: "Platform 1"},
    {platform_id: "platform_2", name: "Platform 2"},
    {platform_id: "platform_3", name: "Platform 3"}
],

...

}

Tento hybridní přístup by byl vhodný, pokud by platform data attributes které často načítáte a zobrazujete spolu s údaji specifickými pro článek, se tak často nemění.

V opačném případě budete muset synchronizovat všechny aktualizace provedené v platform document attributes v platforms collection s podmnožinou atributů, které sledujete jako součást pole platforem pro články s články.

Pokud jde o správu seznamů článků pro jednotlivé platformy, nedoporučoval bych ukládat reference N-to-N v obou kolekcích, protože výše zmíněný mechanismus již umožňuje extrahovat seznamy článků dotazem na articles collection pomocí vyhledávacího dotazu s _id hodnotu platform document :

Approach #1
db.articles.find({"platforms": "platform_1"});

Approach #2:
db.articles.find({"platforms.platform_id": "platform_1"});

Po předložení dvou různých přístupů bych vám nyní doporučil analyzovat vzory dotazů a prahové hodnoty výkonu vaší aplikace a učinit vypočítané rozhodnutí na základě scénářů, se kterými se setkáte.




  1. mongodb $match operace v $lookup pro porovnání objectId nefunguje podle očekávání

  2. Hledání nejvyšší hodnoty z dílčích polí v dokumentech

  3. Čištění osiřelých souborů z GridFS

  4. Otázka agregace MongoDB Map/Reduce Array