如何在mongodb中使用随机数更新所有文档

时间:2014-01-24 12:23:08

标签: mongodb mongodb-java

我在mongodb中创建了以下架构:

{
    "_id" : ObjectId("52d5c71be4b0a5cd12da5e8b"),
    "edges" : [
        {
            "edge_id" : "0",
            "dst" : NumberLong(1),
                    "score" : ***Numeric Value***

        },
        {
            "edge_id" : "1",
            "dst" : NumberLong(6),
                    "score" : ***Numeric Value***

        }
    ],
    "src" : NumberLong(0)
}

以上mongodb集合拥有数百万条记录。我的要求是:  1.使用随机数值更新“分数”字段。  2.所有更新应在几秒钟(1-10秒)内完成。  2.无限次运行上述更新程序。

我想使用mongodb或使用mongodb和Java的组合来执行上述任务。

执行上述任务的最佳方式是什么??

2 个答案:

答案 0 :(得分:1)

MongoDB目前无法一次update批量文档。您可以update仅具有相同值的多个文档。因此,您需要为每个文档单独设置score字段。此外,您显然有一个数组,因此,您需要使用位置数组表示法更新特定的score字段(或设置整个数组)。

这将无法在几秒钟内完成。这只是太多的活动(磁盘和网络)。

如果您详细解释了您尝试使用此更新完成的任务,那么可能会有更好的解决方案。鉴于更新的频率和数据不断变化的事实,我建议这种数据结构仅保存在内存中,并可能通过Web服务或其他传输机制提供给“客户端”。

<强>更新

鉴于您的要求,我建议这不适合MongoDB(或者对于任何磁盘支持的数据库)。

答案 1 :(得分:0)

使用mongodb,我们可以(例如)更新多个文档

db.getCollection('users').update({
    username: {$eq: null}
}, {
    $set: {
            username: 'not_set_yet'
    }
}, {
    multi: true
})

如果您使用Typegoosemongoose,则可以添加一个pre钩子来监听update事件,例如在typegoose中:

import {pre} from 'typegoose'

@pre<User>('save', function(next: HookNextFunction) {
  // Caution! Do not use arrow function here, otherwise the `this` variable would // be point to global instead of
  // this model !
  this.username = this.username === 'not_set_yet' ? generateARandomUserName() : this.username

  next()
})

因此,将两件事结合起来:

  • 在更新语句中将multi设置为true
  • 设置一个update钩子

它应该起作用,所以值得一试。