Je crée une application CRUD qui utilise express, mongodb et mangouste. J'ai 2 schémas (je les appellerai Utilisateurs et Contenu pour plus de simplicité). La fonctionnalité globale de l'application est que les utilisateurs créent du contenu qui peut être consulté par tous les autres utilisateurs. Le contenu peut être édité et supprimé par le créateur, et également favorisé par d'autres utilisateurs. Je veux que les utilisateurs puissent voir leurs favoris dans 2 versions différentes: 1 pour la version au moment où elle a été favorisée (contenu statique), et 1 pour la version "live" actuelle (car le contenu peut avoir été édité après avoir été favorisé).

Je comprends comment créer à la fois un favori statique (je peux copier le contenu dans le tableau des favoris d'un utilisateur) et un favori en direct (je peux stocker une référence au contenu dans le tableau des favoris d'un utilisateur). Ce que je ne peux pas comprendre, c'est comment utiliser ces deux méthodes en même temps, afin qu'un utilisateur puisse cliquer sur l'un de ses favoris et basculer entre le contenu statique et le contenu en direct. Mon idée est que, puisque le contenu copié dans les favoris d'un utilisateur contient un champ ObjectId de contenu, je devrais pouvoir le remplir et accéder au contenu en direct à partir du contenu statique. Suis-je fou?

User {
  (some properties of the user...)

  favorites: [{_id, title, body,...},{_id, title, body,...}...]
}

Content {
  objectId,
  title,
  body,
  (more properties of the content...)
}

À l'heure actuelle, ma structure ressemble à ce qui précède, je suis donc en mesure de parcourir les favoris d'un utilisateur et de rendre le contenu statique (car le contenu réel a été copié dans les favoris, pas seulement une référence au contenu). Ce que je me demande, c'est si je peux remplir l'ObjectId dans les favoris pour accéder à la version live de ce contenu, afin que je puisse rendre la version live en plus de la version statique. Existe-t-il une meilleure pratique pour réaliser cette fonctionnalité?

0
jcq5010 4 nov. 2019 à 20:24

1 réponse

Meilleure réponse

Je crois que cette structure pourrait accomplir ce dont vous avez besoin

User{

 _id: ObjectId("USER ID")

 favorites:[ ObjectId("CONTENT 1"), ObjectId("Content 2")]

} 

Content{

  _id:ObjectId("CONTENT 1")

  CreatorID: ObjectId("USER ID")

 OrignalContent:{
        title: title 1 
        body: body 1
 }
 UpdatedContent:{

    title: UpdatedTitle1
    body: UpdatedBody1
 }

}

Permettez-moi d'expliquer ce qui se passe, donc User aura un tableau _id et favorites qui stockera le _id du Content. Ensuite, Content aura un CreatorID afin que nous puissions suivre qui a créé le contenu et le modifier. Donc, si user veut voir Content1, vous pouvez le trouver en utilisant _id et obtenir à la fois original et UpdatedContent dépend de celui qu'il veut voir.

De cette façon, vous n'aurez pas à prendre snapshots et à copier fields dans chaque objet du tableau, vous n'en garderez que la référence et Updating et deleting serait plutôt simple .

Assurez-vous que lorsque le owner du Content envoie une demande de mise à jour, vous ne mettez à jour que le UpdatedContent et non le orignalContent.

Mise à jour 2

Selon votre commentaire, vous souhaitez activer une sorte de versioning. Je pourrais vous donner mon avis, mais il pourrait y avoir une meilleure façon de le faire.

User{

 _id: ObjectId("USER ID")

 favorites:[ {ID:ObjectId("CONTENT 1"),version: v1}, {ID:ObjectId("Content 2"),version:v2}]

} 

Content{

  _id:ObjectId("CONTENT 1")

  CreatorID: ObjectId("USER ID")

 OrignalContent:{
        title: title 1 
        body: body 1
 }
 UpdatedContent:{

 v1:{
    title: UpdatedTitle1
    body: UpdatedBody1
   }

   v2:{
    title: UpdatedTitle2
    body: UpdatedBody2

 }

}

Cette approche stockera Duplicate tous les properties encore et encore (si vous avez 100 versions, alors 100 de propriétés similaires). Une alternative pourrait être de stocker changed properties only (Metadata) (de cette façon, toutes les propriétés ne sont pas répétées, juste celles modifiées).

La première façon vous permettra d'écrire des requêtes simples dans find et update mais consommera de la mémoire.

La deuxième façon pourrait vous faire économiser de la mémoire mais maintaining et writing queries seront un peu fastidieux

0
Shivam Sood 4 nov. 2019 à 20:26