首页 > 解决方案 > 如何使用 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:
}

编辑:问题是我在很多地方都为用户的项目实现了代码。如果我更改该数组,那么这将是一个重大更改。还有其他方法吗?

标签: javascriptnode.jsmongodb

解决方案


如果项目数量较少,Kausko 的答案是完美而简单的。在这种情况下,您可以迭代对象数组并在每次用户访问“上次访问时间”的项目时更新插入。但是,这是 CPU 昂贵的任务。

推荐方法

另一种方法是将用户的项目保存为地图,其中str(Project(ObjectID))Key 并且{ id: Project(ObjectID), viewedAt: time }value

这将插入复杂度降低到 O(1)。两种方法的获取复杂度保持不变

错过了编辑 - 使用您的方案来避免破坏性更改

在 Project Schema 上有一个地图,其中 str(User(ObjectID)) 是Key并且timestamp()value


推荐阅读