我在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的组合来执行上述任务。
执行上述任务的最佳方式是什么??
答案 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
})
如果您使用Typegoose
或mongoose
,则可以添加一个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
钩子它应该起作用,所以值得一试。