在Mongo中构建反向列表的更快方法

时间:2015-04-03 14:07:48

标签: java mongodb upsert spring-mongo

我想在MongoDB集合中构建反向列表。 集合看起来像这样:

{ "word" : 2, "docToPos" : { "1" : [ 0 ] } }
{ "word" : 5, "docToPos" : { "1" : [ 1 ] } }
{ "word" : 1, "docToPos" : { "1" : [ 2 ], "2" : [ 1 ] } }
{ "word" : 9, "docToPos" : { "2" : [ 2, 43, 1246 ] } }

word是字典中的一些ID,docToPos是地图documentposition - 例如,字词2位于位置1的文档1中,而字词9位于文档中2位于第2,43和1246位。

我想要添加到数据库的每个新文档都只是一个带有单词ID的数组:

[23, 43, 75, 18, ... ]

所以使用spring-mongo我有这个java代码:

for (int i=0; i < array.length; i++) {
  invertedListDao.upsert(array[i], documentId, i);
}

(upsert方法由我实现)

此解决方案有效,但如果文档有10万个单词,则mongo需要10万个查询。

所以最后,我的问题是:这是一种更快地做到这一点的方法吗?例如:立即查询整个数组并在db中执行此操作?我知道eval中有mongo个功能,但mongo-spring

中没有一个功能

1 个答案:

答案 0 :(得分:3)

提高效果的一种方法是使用bulk upserts

var bulk = db.invertedListDao.initializeUnorderedBulkOp();
for (var i=0; i < array.length; i++){
  bulk.find({...}).upsert().replaceOne({...})
}
bulk.execute();

my answer here概述了为什么效率更高以及你可以期待什么样的速度提升的原因,但无论多少字,基本上你都会做只有1次调用到mongo你有。

我不熟悉java spring mongo,但是我的基本搜索suggests that it is supported,我希望你能找到如何在你的java驱动程序中实现批量upsert。

P.S。在Bartektartanus的帮助下,这里是link to official documentation