javascript - 如何使用 mongoDB 实现最后/最近访问的功能,例如 google docs?
问题描述
我有两个集合,用户和项目。并且它们之间存在多对多的关系。一个用户可以有多个项目,一个项目可以分配给多个用户。现在在用户对象中,我有一个项目数组来存储分配给该用户的项目的项目 ID。
现在,当用户打开一个项目时,我想捕获时间戳。同一个项目可以被多个用户访问,并且他们都应该只看到他们自己的最后访问时间。我怎样才能实现这个功能?
用户对象:
{
_id: ObjectID("SOME_ID"),
name: "Name",
email: "email@xyz.com",
projects: [ObjectID("SOME_ID"), ObjectID("SOME_ID"), .... ]
}
project object:
{
_id: ObjectID("SOME_ID"),
name: "Name",
"desc": "Description:
}
编辑:问题是我在很多地方都为用户的项目实现了代码。如果我更改该数组,那么这将是一个重大更改。还有其他方法吗?
解决方案
如果项目数量较少,Kausko 的答案是完美而简单的。在这种情况下,您可以迭代对象数组并在每次用户访问“上次访问时间”的项目时更新插入。但是,这是 CPU 昂贵的任务。
推荐方法
另一种方法是将用户的项目保存为地图,其中str(Project(ObjectID))是Key 并且{ id: Project(ObjectID), viewedAt: time }
是value。
这将插入复杂度降低到 O(1)。两种方法的获取复杂度保持不变
错过了编辑 - 使用您的方案来避免破坏性更改
在 Project Schema 上有一个地图,其中 str(User(ObjectID)) 是Key并且timestamp()
是value。
推荐阅读
- python - 将作为字符串类型键入的多行字节字符串转换为正确的字符串
- java - lombok & jackson 不能与 openjdk12 一起工作
- javascript - 我可以指定一个配置文件,用 electron-builder 编译的可执行文件在打包后可以访问吗?
- python - 如何使用 open 和 .write 将字符串 + 变量值写入同一行的文件中?
- terraform - 在删除 local_file 之前运行 Destroy-Time Provisioner
- android - 向上滚动时RecyclerView图像跳转?
- electron - 如何使用电子打包器设置自定义可执行图标?
- java - 您将如何分析太大而无法存储的文件?
- c# - 使用 C# MySQL 连接器“无法连接到任何指定的 MySQL 主机”
- jestjs - 开玩笑找不到模拟模块