1

ドキュメントがエラスティック検索でインデックス化されるシナリオがあり、一致したドキュメントを mongo で、タイムスタンプでソートされた前後のドキュメントとともに取得する必要があります。アイデアは、元のドキュメントとともにドキュメントのコンテキストを取得することです。

シーケンシャル _id を使用すると、これを正常に実行できるようになりました。例として、次のデータを使用します。

[
    {_id: 1, value: 'Example One' },
    {_id: 2, value: 'Example Two' },
    {_id: 3, value: 'Example Three' },
    {_id: 4, value: 'Example Four' },
    {_id: 5, value: 'Example Five' },
    {_id: 6, value: 'Example Six' },
    ...
]

ES で「Four」を検索すると、4 のドキュメント _id が返されます。これはシーケンシャルであるため、mongo クエリを作成して、id - 2 と id + 2 (この場合は 2 - 6) の間の範囲を取得できます。これは機能します。まあ、ドキュメントを削除しない限り。ドキュメントを削除すると、ギャップをなくすためにシリーズ全体のインデックスを再作成する必要があります。同じ結果を達成する方法を探していますが、すべてのドキュメントを更新することなくドキュメントを削除することもできます。

私はこれを達成するために他のテクノロジーを使用することにオープンです。必ずしもmongodbに縛られているわけではありません。

4

2 に答える 2

1

次のようなものを使用して、目的の結果を得ることができます。

collection.find( {_id: { $gte: matchedId } } ).limit(3);
collection.find( {_id: { $lt: matchedId } } ).sort({$natural: -1}).limit(2);

明示的な範囲を使用するほど良くはありませんが、ドキュメントの削除時に何も再計算する必要はありません。

はい、私は自然秩序の制限を認識しており、私の特定のユース ケースでは問題になりません。

于 2012-09-08T08:05:26.177 に答える
0

この問題は特に MongoDB とは関係なく、ここで別のデータベース (RDBMS など) を使用する場合と変わりません。現在の ID より小さい/大きいドキュメント ID をループして、一致する最初の 2 つを見つける必要があります。はい、これは、複数のクエリを実行する必要があることを意味します。他の唯一のオプションは、右と左の隣接ノードへのポインターを格納する MongoDB の上に連鎖リストを実装することです。はい、削除の場合は、ポインターを調整する必要があります (基本的なデータ構造アルゴリズム....)。欠点は、変更を実行するために複数の操作が必要になることです。MongoDB はトランザクションではないため、一貫性のない前/次のポインターに遭遇する可能性があります。

于 2012-09-08T06:57:44.743 に答える