猫鼬CRUD应用程序:是否可以将收藏夹存储为静态文档以及参考?

问题描述 投票:0回答:1

我正在构建一个使用express,mongodb和mongoose的CRUD应用程序。我有2个架构(为简单起见,我将它们称为“用户和内容”)。该应用程序的整体功能是用户创建可以被所有其他用户查看的内容。内容可以由创建者编辑和删除,也可以由其他用户收藏。我希望用户能够以2种不同的版本查看他们的收藏夹:1表示收藏时的版本(静态内容),1表示当前的“实时”版本(因为其内容可能在编辑后被编辑)收藏的)。

我了解如何创建静态收藏夹(我可以将内容复制到用户的收藏夹数组中)和实时收藏夹(我可以将对内容的引用存储在用户的收藏夹数组中)。我不知道如何同时使用这两种方法,因此用户可以单击自己喜欢的一种,然后在静态内容和实时内容之间切换。我的想法是,由于用户收藏夹中的复制内容包含一个内容ObjectId字段,因此我应该能够填充该内容并从静态内容访问实时内容。我疯了吗?

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

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

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

现在,我的结构类似于上面的结构,因此我可以遍历用户的收藏夹并呈现静态内容(因为实际内容已复制到收藏夹中,而不仅仅是对内容的引用)。我想知道的是,是否可以在收藏夹中填充ObjectId来访问此内容的实时版本,因此除了静态版本外,我还可以呈现实时版本。是否有实现此功能的最佳实践?

javascript mongoose
1个回答
0
投票

我相信这种结构可以满足您的需求

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
 }

}

让我解释发生了什么,因此User将具有_idfavorites数组,它们将存储_idContent。然后Content将有一个CreatorID,以便我们可以跟踪谁创建了内容并可以对其进行编辑。因此,如果user要查看Content1,则可以使用_id找到它,并让originalUpdatedContent都取决于他想看哪个。

这样,您就不必在数组中的每个对象中都使用snapshots并复制fields,只需要对其进行引用,Updatingdeleting就非常简单。

确保ownerContent发送更新请求时,您仅更新UpdatedContent而不是orignalContent

更新2

根据您的评论,您想启用某种versioning。我可能会给您我的意见,但可能会有更好的方法。

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

 }

}

此方法将一遍又一遍地存储Duplicate所有properties(如果您有100个版本,则有100个相似属性)。另一种可能是存储changed properties only (Metadata)(这样,不是每个属性都重复,而只是更改后的属性)。

第一种方法将允许您向findupdate编写简单查询,但会占用内存。

第二种方法可以为您节省一些内存,但是maintainingwriting queries会有点乏味

© www.soinside.com 2019 - 2024. All rights reserved.