2017-06-13 13 views
0

I _idを経由して単一のクエリのほか、このクエリのインデックスを作成するための戦略は何ですか?

const CommentSchema = new mongoose.Schema({ 
    author: { type: ObjectID, required: true, ref: 'User' }, 
    thread: { type: ObjectID, required: true, ref: 'Thread' }, 
    parent: { type: ObjectID, required: true, ref: 'Comment' }, 
    text: { type: String, required: true }, 
}, { 
    timestamps: true, 
}); 

を各スレッドにコメントモデルを持って、私はこの方法を介してデータベースを照会する:

範囲クエリ

const query = { 
    thread: req.query.threadID, 
    _id: { $gt: req.query.startFrom } 
}; 

CommentModel.find(query).limit(req.query.limit); 

私の意図スレッドに関連するコメントを見つけて、結果の一部を得ることです。このクエリは期待通りに機能するようです。私の質問は次のとおりです:

  1. これは私の要件を満たす正しい方法ですか?

  2. フィールドのインデックスを正しく設定するにはどうすればよいですか?これは複合インデックスですか、または各フィールドのインデックスを分割する必要がありますか? explain()の結果を確認しましたが、クエリフィールドの1つにインデックスが含まれている限り、inputStage.stageはいつもCOLLSCANではなくIXSCANでしょうか?これはクエリのパフォーマンスを確認するための重要な情報ですか?

  3. 1つのフィールドに基づいて検索する必要があるたびに、これらのフィールドのインデックスを作成する必要がありますか?著者が投稿したすべてのコメントを特定のスレッドに検索したいとします。このような

コード:

const query = { 
    thread: req.query.threadID, 
    author: req.query.authorID, 
}; 

私はこの要件のために複合インデックスを作成する必要がありますか?

答えて

1

複数のフィールドでクエリを実行する場合は、の複合インデックスを作成する必要があります。例えば

あなたは、このクエリを使用したい場合は、のような複合インデックスを作成する必要が

const query = { 
    thread: req.query.threadID, 
    author: req.query.authorID, 
}; 

:その後、つまり

db.comments.createIndex({ "thread": 1, "author": 1 }); 

を、インデックスは、同様にアイテム欄にクエリをサポートしています商品と在庫の両方として:

db.comments.find({ thread: "threadName" }) 
db.comments.find({ thread: "threadName", author: "authorName" } 

この1つをサポートしていません

db.comments.find({ author: "authorName", thread: "threadName" } 

あなたが怒鳴るのために、その後{ "thread": 1, "author": 1, "parent": 1 }のインデックスを作成すると言うのは、クエリのサポートインデックス

threadフィールド、

threadフィールドとauthorフィールド、

threadフィールドを命じましたauthorフィールドとparentフィールドです。

しかしparentフィールド、または

authorparentフィールド、怒鳴るため

authorフィールドに

ををサポートしていません。答えを

For more read this

+0

ありがとう!私の質問は、複合インデックスのフィールドのどれが既にインデックスであるObjectIDであるのですか?ありがとう:)おかげで:) –

+0

私はあなたがすでに1つのインデックスを追加し、その後、1つの複合インデックスをクエリを適用すると知っている限り単一インデックスフィールドと複合インデックスフィールドの組み合わせを使用すると、複合インデックスとしては機能しません。複合インデックスとして追加する必要があります。 –

関連する問題