首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >频繁满载的Mongo - Tree数据

频繁满载的Mongo - Tree数据
EN

Stack Overflow用户
提问于 2020-10-10 04:42:49
回答 1查看 81关注 0票数 2

我正在使用mongodb并存储树数据( MongoDB是目前唯一的选择)。

代码语言:javascript
运行
复制
      10     ->>> Root node
      /\
     /  \
    8    6  ---->> 8 & 6 child node of 10
    /\    /\
   /  \  /  \
  4    5 2   1  ---->> 4 & 5 child node of 8 ...

在mongoDB中,每个节点都是一个单独的文档,并且每个文档都有一堆字段。

样本数据,

代码语言:javascript
运行
复制
{
  "_id": "234463456453643563456",
  "name": "Mike",
  "empId": "10",
  "managerId": "8",
  "hierarchy": [
     8,
     10
   ]
  "projects" : [ "123", "456", "789"]
}

在这里,hierarchies字段将具有从第1级到顶级的经理ids。

任何文档都可以使用任何字段进行更新,节点可以移动到任何位置。基本上,就是组织结构的改变。

我有一个用例,其中更改将在其他系统中捕获,并且我的系统将每2小时更新一次完整的活动负载(80万条记录中的200k条记录)。

在这里,如果有任何组织更改,如8移动到6以下,则从下到上的层次结构将更改为8以下的所有节点。如果在b/w中完全加载失败,则在完成加载之前,组织层次结构结果将不会正确。

结果应该是在完全更新之前或完全更新之后,而不是在b/w中。我正在考虑版本控制来处理这个问题。有没有更好的方法用mongo来处理这个问题呢?

满载时大约有200k条记录。但是,实际的变化可能会少于1k的记录,我们不知道很多次。

EN

回答 1

Stack Overflow用户

发布于 2020-10-18 01:42:04

如果您需要全有或全无(原子)数据库更新,其中数据库客户端不能读取无效的更新中状态,那么您需要一个事务。

您可以通过认识到图的某些子集在更新后是有效的来进行优化,因此对图的子集的查询是有效的,然后您就不需要使用数据库的事务特性了。

但您仍然会阻止或拒绝来自某些客户端的查询,这会使您的模式、查询或体系结构变得更加复杂。

如果这是一个业务问题,那么我会推动业务需求。(如果你可以这样做,你没有说这是否是一个选项。)

您的客户端已经在读取可能已过期2小时的数据。如果您正在应用的批量更新是排序的,那么您可以按时间顺序进行这些更新,并且您的客户端将始终接收最近有效的状态(但可能不是最近的状态)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64287059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档