我有一个名为die
的收藏集。 Codes
的定义方式如下:
Schema
有一个查询看起来像这样:
import mongoose from 'mongoose'
import autoIncrement from 'mongoose-auto-increment';
const Schema = mongoose.Schema;
const CodesSchema = mongoose.Schema(
{
configId: { type: Number },
campaignId: { type: Number },
permissions: {
all: { type: Boolean, default: false },
users: { type: [Number], default: [] }
}
)
autoIncrement.initialize(mongoose.connection);
CodesSchema.plugin(autoIncrement.plugin, { model: 'Codes', field: 'campaignId' });
export default mongoose.model('Codes', CodesSchema)
这很好,但是如果数据库中有大量文档,则此查询的速度确实很慢。
我可以采取什么措施来改善此特定查询的性能?我认为const query = {
$and:[
{$or: [
{'permissions.all': true},
{'permissions.users': 12}
]},
{configId: 3}
]
};
Codes.find(query, (err, res) => {
// do something with the result
})
会有所帮助,但是由于存在createIndex
和$and
条件,因此不确定是否可以应用。
更新
我以这种方式添加了索引:
$or
但是使用CodesSchema.index({configId: 1, 'permissions.all': 1, 'permissions.users': 1});
选项运行查询会返回:
.explain('executionStats')
这似乎不正确,因为检查的文档数大于返回的文档数。
答案 0 :(得分:1)
索引本身是正确的。
它必须是CodesSchema.index
,而不是Code.index
。
确保您调用Code.syncIndexes
来更新索引dbside。
“说明”部分-您应选中winningPlan
。
如果查询未使用任何索引,则应该类似
"winningPlan" : {
"stage" : "COLLSCAN",
"filter" : {
使用索引时,它将更改为
"winningPlan" : {
"stage" : "FETCH",
"inputStage" : {
"stage" : "OR",
"inputStages" : [
{
"stage" : "IXSCAN",
"keyPattern" : {