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

redigering af underdokumenter N-N forhold i mongodb

Baseret på de oplysninger, du har givet, vil jeg anbefale to mulige tilgange, der tager udgangspunkt i det samme grundlag:

Jeg vil anbefale denne tilgang, hvis:

  • Du har en høj kardinalitet af både artikeldokumenter såvel som platforme
  • Du ønsker at være i stand til at administrere begge entiteter uafhængigt, mens du også synkroniserer referencer mellem dem

    // 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",
    ...
    }
    

Selvom denne tilgang er ret fleksibel, koster det en pris - hvis du har brug for både artikel- og platformsdata, bliver du nødt til at sende flere forespørgsler til din MongoDB-instans, da dataene er opdelt i to forskellige samlinger.

For eksempel, når du indlæser en artikelside, i betragtning af at du også vil vise en liste over platforms , skal du affyre en forespørgsel til articles collection , og udløser derefter også en søgning på platforms collection for at hente alle de platformsenheder, som den pågældende artikel er udgivet til via medlemmerne af platform s-array på article document .

Men hvis du kun har en lille undergruppe af platform attributes, som du ofte får adgang til som du skal have til rådighed, når du indlæser et article document , kan du forbedre platforms array på articles collection for at gemme disse attributter ud over _id henvisning til platformsdokumenterne:

// 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"}
],

...

}

Denne hybride tilgang ville være egnet, hvis platform data attributes som du ofte henter for at vise sammen med artikelspecifikke data, ændres ikke så ofte.

Ellers bliver du nødt til at synkronisere alle de opdateringer, der er lavet til platform document attributes i platforms collection med det undersæt af attributter, som du sporer som en del af platformsarrayet for artikeldokumenter.

Med hensyn til håndtering af artikellister for individuelle platforme, vil jeg ikke anbefale at gemme N-til-N-referencer i begge samlinger, da den førnævnte mekanisme allerede giver dig mulighed for at udtrække artikellister ved at forespørge articles collection ved hjælp af en søgeforespørgsel med _id værdien af ​​platform document :

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

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

Efter at have præsenteret to forskellige tilgange, vil jeg anbefale nu, at du analyserer forespørgselsmønstrene og ydeevnetærsklerne for din ansøgning og træffer en beregnet beslutning baseret på de scenarier, du støder på.




  1. Spring Data MongoDB - $eq indenfor $project support

  2. Autoload-konfiguration indlæser ikke MongoDB-klasser

  3. Kan jeg gøre to kolonner unikke for hinanden? eller bruge sammensatte primære nøgler i redis?

  4. Sådan indstilles/fås Pandas dataframes ind i Redis ved hjælp af pyarrow