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にマップ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メソッドは私が実装しています)

このソリューションは機能しますが、ドキュメントに 100,000 語が含まれている場合、mongo に 100,000 クエリが必要です。

最後に、私の質問は次のとおりです。これをより速く行う方法はありますか? 例: 配列全体を一度にクエリし、これを db で実行しますか? evalに関数があることは知っていますがmongo、にはありませんmongo-spring

4

1 に答える 1

3

パフォーマンスを向上させる 1 つの方法は、一括アップサートを使用することです。

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 ドライバーに一括アップサートを実装する方法を見つけていただければ幸いです。

PSそしてBartektartanusの助けを借りて、ここに公式ドキュメントへのリンクがあります.

于 2015-04-06T07:46:07.167 に答える