3

我想在我的 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方法由我实现)

此解决方案有效,但如果文档有 100 000 个单词,则需要 100 000 次查询才能到达 mongo。

所以最后,我的问题是:有没有一种方法可以更快地做到这一点?例如:一次查询整个数组并在数据库中执行?我知道里面有eval函数mongo,但是里面没有mongo-spring

4

1 回答 1

3

提高性能的一种方法是使用批量 upserts

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

我在此处的回答中概述了它更高效的原因以及您可以期待什么样的速度提升,但基本上无论您有多少单词,您只会对 mongo 进行 1 次调用。

我不熟悉 java spring mongo,但我的初步搜索表明它是受支持的,我希望你能够找到如何在你的 java 驱动程序中实现批量 upserts。

PS在 Bartektartanus 的帮助下,这里是官方文档的链接

于 2015-04-06T07:46:07.167 回答