Structures de données relationnelles MongoDB avec un tableau de _id

Nous utilisons MongoDB depuis quelque temps déjà et il y a une chose que je ne peux tout simplement pas comprendre. Disons que j’ai une collection d’utilisateurs qui ont une liste de suivi ou une liste d’éléments favoris comme celle-ci:

usersCollection = [ { _id: 1, name: "Rob", itemWatchList:[ "111111", "222222", "333333" ] } ]; 

et une collection séparée d’objects

 itemsCollection = [ { _id:"111111", name: "Laptop", price:1000.00 }, { _id:"222222", name: "Bike", price:123.00 }, { _id:"333333", name: "House", price:500000.00 } ]; 

Évidemment, nous ne voudrions pas insérer l’object entier obj dans le tableau itemWatchList car les données des articles pourraient changer, c’est-à-dire le prix.

Disons que nous attirons cet utilisateur vers l’interface graphique et voulons afficher une grid de l’élément itemWatchList. Nous ne pouvons pas parce que tout ce que nous avons est une liste d’identifiants. Est-ce que la seule option est de faire une deuxième collection.find ([itemWatchList]) et ensuite, dans le rappel des résultats, de manipuler l’enregistrement utilisateur pour afficher les éléments actuels? Le problème avec cela est que si je renvoie un tableau de plusieurs utilisateurs, chacun avec un tableau de itemWatchList, ce serait un cauchemar de rappel pour essayer de garder les résultats exacts. Je sais que Map Reduce ou Aggregation framework ne peut pas parcourir plusieurs collections.

Quelle est la meilleure pratique ici et existe-t-il une meilleure structure de données qui devrait être utilisée pour éviter ce problème dans son ensemble?

Vous avez 3 options différentes pour afficher des données relationnelles. Aucune d’entre elles n’est parfaite, mais celle que vous avez choisie n’est peut-être pas la meilleure option pour votre cas d’utilisation.

Option 1 – Référence aux identifiants C’est l’option que vous avez choisie. Conservez une liste d’identifiants, généralement dans un tableau des objects que vous souhaitez référencer. Plus tard, pour les afficher, vous effectuez un second aller-retour avec une requête $in requête.

Option 2 – Sous-documents C’est probablement une mauvaise solution pour votre situation. Cela signifie que l’ensemble de la série de documents stockés dans la collection d’éléments doit être placé dans votre collection d’utilisateurs en tant que sous-document. C’est très bien si un seul utilisateur peut posséder un élément à la fois. (Par exemple, adresses de livraison et de facturation différentes.)

Option 3 – Une combinaison C’est peut-être la meilleure option pour vous, mais cela impliquera de changer votre schéma. Par exemple, disons que vos éléments ont 20 propriétés, mais que vous ne vous souciez que du nom et du prix de la majorité de vos écrans. Vous avez alors un schéma comme celui-ci:

 usersCollection = [ { _id: 1, name: "Rob", itemWatchList:[ { _id:"111111", name: "Laptop", price:1000.00 }, { _id:"222222", name: "Bike", price:123.00 }, { _id:"333333", name: "House", price:500000.00 } ] } ]; itemsCollection = [ { _id:"111111", name: "Laptop", price:1000.00, otherAtsortingbutes: ... }, { _id:"222222", name: "Bike", price:123.00 otherAtsortingbutes: ... }, { _id:"333333", name: "House", price:500000.00, otherAtsortingbutes: ... } ]; 

La difficulté est que vous devez ensuite maintenir ces éléments synchronisés les uns avec les autres. (C’est ce que l’on entend par cohérence éventuelle.) Si vous avez une application à faible enjeu (pas pour les opérations bancaires, les soins de santé, etc.), ce n’est pas un gros problème. Vous pouvez avoir les deux requêtes de mise à jour successives, mettant à jour les utilisateurs qui ont cet article au nouveau prix. Vous remarquerez ce type de latence sur certains sites Web si vous y prêtez attention. Ebay, par exemple, a souvent des prix différents sur les pages de résultats de recherche que le prix réel une fois que vous avez ouvert la page, même si vous retournez et actualisez les résultats de la recherche.

Bonne chance!