MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

édition de sous-documents relation N-N dans mongodb

Sur la base des informations que vous avez fournies, je recommanderais deux approches possibles, en partant du même principe :

Je recommanderais cette approche si :

  • Vous avez une cardinalité élevée des deux documents d'article, ainsi que des plates-formes
  • Vous voulez pouvoir gérer les deux entités indépendamment, tout en synchronisant les références entre elles

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

Même si cette approche est assez flexible, elle a un coût - si vous avez besoin à la fois de données d'article et de plate-forme, vous devrez envoyer plus de requêtes à votre instance MongoDB, car les données sont divisées en deux collections différentes.

Par exemple, lors du chargement d'une page d'article, en considérant que vous souhaitez également afficher une liste de platforms , vous devrez lancer une requête sur la articles collection , puis déclencher également une recherche sur la platforms collection pour récupérer toutes les entités de la plateforme sur lesquelles cet article est publié via les membres de la platform s tableau sur le article document .

Cependant, si vous n'avez qu'un petit sous-ensemble d'attributs platform fréquemment consultés que vous devez avoir à disposition lors du chargement d'un article document , vous pouvez améliorer les platforms tableau sur la articles collection pour stocker ces attributs en plus du _id référence aux documents de la plateforme :

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

...

}

Cette approche hybride conviendrait si les platform data attributes que vous récupérez fréquemment pour les afficher avec les données spécifiques à l'article ne changent pas souvent.

Sinon, vous devrez synchroniser toutes les mises à jour apportées aux platform document attributes dans la platforms collection avec le sous-ensemble d'attributs que vous suivez dans le cadre du tableau de plates-formes pour les documents d'article.

En ce qui concerne la gestion des listes d'articles pour les plates-formes individuelles, je ne recommanderais pas de stocker les références N à N dans les deux collections, car le mécanisme susmentionné vous permet déjà d'extraire des listes d'articles en interrogeant la articles collection en utilisant une requête de recherche avec le _id valeur du platform document :

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

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

Après avoir présenté deux approches différentes, je vous recommande maintenant d'analyser les modèles de requête et les seuils de performances de votre application et de prendre une décision calculée en fonction des scénarios que vous rencontrez.