gpt4 book ai didi

php - map 中的原子性/减少新记录 (MongoDB)

转载 作者:可可西里 更新时间:2023-11-01 09:47:12 24 4
gpt4 key购买 nike

情况是这样的:我有一个 MongoDB 集群和一个网络应用程序,它执行相当密集的 Map/Reduce 查询。此查询在 cron 作业中定期(每 5 分钟)发生一次,结果存储(使用 $merge)到一个集合中。

有效方法:目前,查询对其集合中的每条记录执行。所述集合正在慢慢增长到数百万行,并且每次运行时都需要更长的时间。

显而易见的解决方案 是对新记录运行 Map/Reduce,并对旧存储值使用 reduce 函数来计算正确的值。 MongoDB 很棒,它允许您指定一个 reduce 选项而不是 merge 来做到这一点。

我不明白的是:如何仅对初始集合中的新记录正确执行 M/R。我看到了两种可能的解决方案,但都不好。想法?

  1. 我可以标记已处理的记录。问题是如何标记我刚刚 M/R 过的完全相同的记录?
  2. 我可以查询匹配项,然后将 ID 列表作为 $in: [id1, id2, ...] 查询传递给 Map/Reduce,然后发送更新使用相同的 $in 设置我的标志。但这真的很不优雅,我不知道当记录列表很大时它会如何执行。

tl;dr:如何在 Map/Reduce 查询中只选择新记录,将其结果缩减到一个集合中。

最佳答案

#mongodb IRC channel 上的好心人帮助我解决了这个问题。一个简单的解决方案是拥有一个状态机字段,并执行以下操作(以伪代码形式):

set {state:'processing'} where {state:{$exists:false}}
mapreduce {...} where {state:'processing'}
set {state:'done'} where {state:'processing'}

现在,这是次优的,因为它在包含数百万条记录的集合上浪费了大量磁盘空间。但真正的问题是,我为什么不早点想到这一点?

关于php - map 中的原子性/减少新记录 (MongoDB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6539222/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com