我想在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
是地图document
到position
- 例如,字词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
答案 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。