0

Je suis nouveau sur mongodb NoSQL et je suis bloqué au point où je suis incapable de prendre la décision de modéliser le schéma qui pourrait le mieux servir mon but.Mongodb Schema pour Posts and Shares

Je dois concevoir un schéma de manière à ce que mon résultat final soit Posts et Partages classés par temps. Pour cela, je considérais deux options:


Option 1: Different Collection pour postes et Partager comme:

Schéma de collection Post:

var postSchema = mongoose.Schema({ 
    postText: String, 
    postedBy: String, 
    privacy: Number, 
    updatedOn: { type: Date, default: Date.now }   
}, { collection: 'posts' }); 

Schéma pour Partager Collection

var shareSchema = mongoose.Schema({ 
    dis_Id: { type: mongoose.Schema.Types.ObjectId }, // Id of post that is shared 
    shareBy: { type: mongoose.Schema.Types.ObjectId }, 
    shareText: String, 
    share_privacy: Number, 
    shareOn: { type: Date, default: Date.now } 
}, { collection: 'shares' }); 

Option 2: Intégrer Quote-part dans les messages se

Nouveau schéma pour post

var postSchema = mongoose.Schema({ 
    postText: String, 
    postedBy: String, 
    updatedOn: { type: Date, default: Date.now }, 
    privacy: Number, 
    share: { 
    shareBy: { type: mongoose.Schema.Types.ObjectId }, 
    shareText: String, 
    share_privacy: Number, 
    shareOn: { type: Date } 
    }  
}, { collection: 'posts' }); 

Maintenant que cela pourrait être un meilleur choix? L'option 1 pose un problème d'interrogation car il n'y a pas de jointure dans mongodb et l'option 2 entraîne la réplication des mêmes données et peut atteindre plusieurs milliards pour des centaines de milliers d'utilisateurs.

+0

Je ne comprends toujours pas pourquoi la 1ère option n'est pas viable. Je suis d'accord que join n'est pas supporté dans mongodb pour les requêtes en ligne. Cependant, en utilisant ce [post] (https://stackoverflow.com/questions/5681851/mongodb-combine-data-from-multiple-collections-into-one-how) vous pouvez utiliser join pour les processus hors ligne. Comment la première option est-elle en train de vaincre le but? Peux-tu élaborer? –

+0

** MapReduce ** Technique renvoie un ** document ** BSON qui peut être d'une taille maximale de ** 16mb **, donc mon nombre de messages et le nombre de partages par poste peuvent augmenter et peuvent atteindre 16mb taille du document résultant –

+0

D'accord. Je suis d'accord avec vous concernant map-reduce usecase. Mais je ne suis toujours pas capable de comprendre pourquoi la 1ère option ne sera pas utile. Je veux dire que si vous pouvez définir vos demandes d'api ou votre cas d'utilisation, ce sera plus clair. –

Répondre

0

Ok. Je suggère l'approche suivante:

  1. Puisque vous avez déjà le nom d'utilisateur, vous pouvez récupérer la liste des poste correspondant à cet identifiant dans un ordre à l'aide sort triée. En cours d'itération sur chaque publication, vous pouvez récupérer les partages dans l'ordre trié en utilisant le même type que celui utilisé ci-dessus.

La clé ici est de comprendre les index que vous allez définir. Je suggère que vous devriez avoir les index suivants.

post_schema: index composé sur {nom d'utilisateur, updatedOn}

share_schema: indice composé sur {dis_Id, partageAu}.

Si les index composés ne sont pas utilisés, votre application ne sera pas mise à l'échelle pour un grand nombre d'enregistrements.

+0

Ici il y a un autre problème: Bien que je reçois ** postes ** et ** actions ** respectivement dans l'ordre trié mais j'ai besoin de tri plus loin avec le mélange de messages et de partager. ** par exemple **: si (A) est affiché à 9h a été partagé (A1) à 15h alors que B est affiché à 12h. D'après ta logique, j'obtiendra A alors A1 que B mais j'ai besoin de l'ordre A puis B puis A1. –

+0

ok, d'après ce que je comprends, vous devrez écrire une logique personnalisée pour fusionner ces partages/poste. La fonction map-reduce de mongo ne sera pas utile si vous ajoutez tous les enregistrements sur une seule ligne. Toutefois, si vous le gérez de telle sorte qu'un seul enregistrement de publication/partage est une ligne unique, cela peut être fait en utilisant MR. En conclusion, vous devrez écrire une logique personnalisée pour le faire. –

0

Eh bien, il est facile de travailler avec des documents incorporés car vous obtenez toutes les données requises ensemble, donc l'option 2 est bonne dans ce cas. Mais si vous êtes préoccupé par la taille des documents augmentant de plus de 16 Mo alors allez avec l'option 1. Dans ce cas, n'utilisez pas la requête agrégée pour joindre deux collections, car cela prendra du temps, il faudra d'abord effectuer toutes les opérations. sauter l'opération. Au lieu de cela, vous devriez interroger chaque collection individuellement et créer une réponse complète vous-même avec une certaine logique personnalisée.

+0

Bien que comment puis-je faire cela avec l'option 2 en gardant cela à l'esprit: Voici un autre problème: Bien que je reçois les messages et les partages respectivement dans l'ordre, mais j'ai besoin de trier avec mélange de messages et de partager. par exemple: si (A) est affiché à 9h a été partagé (A1) à 15h alors que B est affiché à 12h. Selon votre logique, je vais obtenir A puis A1 que B, mais j'ai besoin de la commande A puis B puis A1 –

+0

pour que vous devez écrire un code personnalisé. Obtenez les documents de la collection que vous voulez et puis fusionnez-les dans l'ordre dont vous avez besoin. – Ricky

+0

Et comment dois-je les fusionner ... Utilisation de l'agrégation ou de toute autre manière? –