6

次のようなコレクションがあります。

{
"_id" : ObjectId("51f4ad560364f5490ccebe26"),
"fiTpcs" : [
    "uuid1",
    "uuid2",
    "uuid3",
    "uuid4",
    "uuid5"
],
"fiTpcsCnt" : 5
}

fiTpcs のリストは長く、後で数百になる可能性があります。コレクションを取得するとき、たとえば一度に 20 個の fiTpcs の限られたリストを取得し、別のリクエストを発行して、fiTpcs から後続のデータを取得したいと考えています。後でデータが多くなったときにクエリが遅くならないようにしたいだけです。mongodbでそれを行う方法はありますか? 今まで、私はやっている

db.userext.find({"_id" : ObjectId("51f4ad560364f5490ccebe26")}).pretty();

これにより、常に完全な fiTpcs 配列が得られます。Spring で Java ドライバーを使用していますが、Spring/Java を使用したソリューションでも問題ありません。注意してください-ソリューションでmongoがfiTpcs配列全体をスキャンしてからその一部をスライスする必要がある場合、実際にはパフォーマンス上の利点は追加されません。それは私が探しているものではありません。

4

2 に答える 2

10

私はあなたの質問を完全に理解していないかもしれませんが$slice、あなたが探しているドロイドは次のようです:

> db.page.find()
{ "_id" : ObjectId("51f4ad560364f5490ccebe26"), "fiTpcs" : [ "uuid1", "uuid2", "uuid3", "uuid4", "uuid5" ], "fiTpcsCnt" : 2 }
> db.page.find({}, {"fiTpcs" : {$slice : 3}})
{ "_id" : ObjectId("51f4ad560364f5490ccebe26"), "fiTpcs" : [ "uuid1", "uuid2", "uuid3" ], "fiTpcsCnt" : 2 }
> db.page.find({}, {"fiTpcs" : {$slice : [1,3]}})
{ "_id" : ObjectId("51f4ad560364f5490ccebe26"), "fiTpcs" : [ "uuid2", "uuid3", "uuid4" ], "fiTpcsCnt" : 2 }
于 2013-08-11T09:23:28.940 に答える
0

さまざまなオプションを考えたり試したりして数日後、これが私が最終的にしたことです。ドキュメントを次のように変更しました。

{
  "_id" : ObjectId("51f4ad560364f5490ccebe26"),
  "page" : 1,  //1 is the default
  "slug" : "some-unique-string-identifier"
  "fiTpcs" : [
    "uuid1",   //these could be long text, like a long comment/essay
    "uuid2",
    "uuid3",
    "uuid4",
    "uuid5"
  ],
  "fiTpcsCnt" : 5
}

memcached に「pageCount」と「totalFiTpcsCnt」を保持しています。MAX_FITPCSCNT = 500 に設定しました (現在は 500、実験的)。タイプ userext の新しいドキュメントを作成するとき、ページの値を 1 に設定します。

新しいオブジェクトを fiTpcs 配列にプッシュする必要がある場合:

1) 「totalFiTpcsCnt」が 500 の倍数であるかどうかを確認します。そうである場合は、同じスラッグ、0 としての fiTpcsCnt、null としての fiTpcs 配列を使用してタイプ userext の新しいドキュメントを作成します。2) 最後の userext を更新します - スラッグと「pageCount」によるクエリ、fiTpcs へのプッシュ。「pageCount」と「totalFiTpcsCnt」のキャッシュを削除します。

userext ドキュメントが必要なときはいつでも、最初のページだけを取得します。こうすれば、タイプ fiTpcs の 500 を超えるオブジェクトを一度にクエリする必要がなくなり、memcached で常に totalFiTpcsCnt が更新されます。

于 2013-08-11T17:42:52.733 に答える