Я считаю, что эта структура может выполнить то, что вам нужно
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
будет иметь массивы _id
и favorites
, в которых будут храниться _id
из Content
. Тогда Content
будет иметь CreatorID
, чтобы мы могли отслеживать, кто создал контент, и редактировать его. Так что, если user
хочет увидеть Content1
, вы можете найти его с помощью _id
и получить, как 1014 *, так и UpdatedContent
зависит от того, кого он хочет видеть.
Таким образом, у вас не будетчтобы взять snapshots
и скопировать fields
в каждый отдельный объект в массиве, вы просто сохраняете ссылку на него, и Updating
и deleting
будут довольно простыми.
Убедитесь, что owner
изContent
отправляет запрос на обновление, вы обновляете только 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)
(таким образом, не каждое свойство повторяется, только измененное).
1-й способ позволит вам писать простые запросы к find
и update
, но будет потреблять память.
2-й способ может сэкономить вам немного памяти, но maintaining
и writing queries
будут немного утомительными