1

私は次のマングーススキーマを持っています:

var dataSchema = new Schema({  
    owner: { type: Schema.ObjectId, ref: 'User' },  
    time : { type: Date, default: Date.now },  
    eventCount:Number  
});

一部の dataObject では、eventCount が定義され、正の数になります。他の dataObject では、eventCount は未定義です。このようなクエリができるだけ高速になるようにインデックスを設計したいと思います。

db.datacollection.find({owner: <some ID>, eventCount: {$exists:true}, time: {<some time range>})

これを行う最善の方法は何ですか?

これが私が考えることができる最良の解決策ですが、誰かがより良い解決策を持っているかどうか知りたいです:

isEventCount ブール変数を dataSchema に追加します。次のロジックを使用して、オブジェクトを db に保存する前に isEventCount が計算されるように、mongoose ミドルウェアをセットアップします。

if(eventCount > 0) {
    isEventCount = true;
} else {
    isEventCount = false;
}

次に、このようなインデックスを作成します

db.datacollection.ensureIndex({user:1, isEventCount: 1, time:1})

そして、このようにクエリを実行します

db.datacollection.find({owner: <some ID>, isEventCount: true, time: {<some time range>})

このアプローチにはいくつかの欠点があります。すなわち:

  1. 冗長な情報をデータベースに保存しています。
  2. これを実現するには、追加のミドルウェア コードを作成する必要があります。
  3. データベース内の既存のエントリを変更する必要があります。

これに役立つより良い解決策またはライブラリを知っている人はいますか?

4

1 に答える 1

0

このクエリで適切なパフォーマンスを得るために、すべてを実行する必要はありません。既存のクエリを使用する:

db.datacollection.find({owner: <some ID>, eventCount: {$exists:true}, time: {<some time range>}

このインデックス:

db.datacollection.ensureIndex({user:1, eventCount: 1, time:1})

ほとんどの場合、非常に優れたパフォーマンスが得られるはずです。明らかに、既存のデータ セットのサイズや分布はわかりませんが、isEventCountフラグを作成する必要があるとはかなり珍しいことが必要になると思います。

一般的に言えば、MongoDB のスキーマ設計で異常な手段を講じる前に、次のことを行います。

1) 妥当な量のテスト データを設定する 2) Explain() を使用してクエリを試す

クエリのパフォーマンスと、いつどのようにインデックスを使用しているかについて、かなり良いアイデアが得られます。

http://docs.mongodb.org/manual/reference/method/cursor.explain/#cursor.explain

于 2014-06-11T14:20:30.567 に答える