私は次のマングーススキーマを持っています:
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>})
このアプローチにはいくつかの欠点があります。すなわち:
- 冗長な情報をデータベースに保存しています。
- これを実現するには、追加のミドルウェア コードを作成する必要があります。
- データベース内の既存のエントリを変更する必要があります。
これに役立つより良い解決策またはライブラリを知っている人はいますか?