4

$where を使用してドキュメント内の 2 つのフィールドを比較する mongoDB でのクエリを高速化したいと考えていますが、これは非常に遅いようです。

私のクエリは次のようになります。

db.mycollection.find({ $where : "this.lastCheckDate < this.modificationDate})

私がやりたいことは、ドキュメントにフィールドを追加することです。つまりisCheckDateLowerThenModDate、おそらくはるかに高速なクエリを実行できます。

db.mycollection.find({"isCheckDateLowerThenModDate":true})

私はmongoDBが初めてで、これを行う方法がわかりません。誰かが私にいくつかのヒントや例を教えていただければ幸いです

  1. 既存のコレクションでそのようなフィールドを初期化する方法
  2. このフィールドを維持する方法。lastCheckDateこれは、またはが変更されたときにこのフィールドを更新する方法を意味しmodificationDateます。

よろしくお願いします。

4

2 に答える 2

1

あなたは正しい方法で考えています!

1.既存のコレクションでそのようなフィールドを初期化する方法。

最も簡単な方法は、各ドキュメントを (言語から) ロードし、このフィールドを計算し、更新して保存することです。

または、mongo シェル経由で更新を実行できます。

db.mycollection.find().forEach(function(doc) { 
   if(doc.lastCheckDate < doc.modificationDate)
   {
     doc.isCheckDateLowerThenModDate = true;
   }
   else
   {
     doc.isCheckDateLowerThenModDate = false;
   }
   db.mycollection.save(doc); 
});

2.このフィールドを維持する方法。これは、lastCheckDate または modifiedDate が変更されたときにこのフィールドを更新する方法を意味します。

クライアントコードから自分で行う必要があります。更新用のラッパーを作成し、操作を保存し、そのたびにこの値を再計算します。この更新が確実に機能することを確認するには、単体テストを作成してください。

于 2012-08-30T09:03:47.440 に答える
1

JavaScript インタープリターを使用して各ドキュメントを評価しているため、$whereは低速です。

いくつかの代替手段があります。

1)ユースケースが「更新が必要なレコードを探す」であると仮定すると、スパースインデックスを利用できます:

  • が更新されるたびに、このneedsCheckingようなブールフィールドを追加します$setmodificationDate

  • 「チェック」手順で、このフィールドが設定されているドキュメントを見つけます(疎インデックスのために高速である必要があります)

    db.mycollection.find({'needsChecking':true});

  • 必要なチェックをすべて行った後$unsetneedsCheckingフィールド。

2) MongoDB 2.2 の新しい (そしてより高速な) 機能はAggregation Frameworkです。

日付の比較に基づいて「isUpdated」フィールドを追加し、一致するドキュメントをフィルタリングする例を次に示します。

    db.mycollection.aggregate(
            { $project: {
                    _id: 1,
                    name: 1,
                    type: 1,
                    modificationDate: 1,
                    lastCheckDate: 1,
                    isUpdated: { $gt:["$modificationDate","$lastCheckDate"] }
            }},
            { $match : {
                    isUpdated : true,
            }}
    )

Aggregation Framework を使用する際の現在の注意事項は次のとおりです。

  • 含めるフィールドを指定する必要があります_id
  • 結果は、現在の最大 BSON ドキュメント サイズ (MongoDB 2.2 では 16Mb) に制限されます。
于 2012-08-30T10:19:55.423 に答える