我有这种简单的聚合查询
db.SomeCollection.aggregate([{
"$match": {
"Id": "someId"
}
}, {
"$sort": {
"someISODatePropertyName": 1
}
}, {
"$unwind": {
"path": "$somePropertyName"
}
}], {
allowDiskUse: true
})
此查询最多返回50个项目,需要10秒钟才能完成。
如果我只是用数字改变sort属性:
db.SomeCollection.aggregate([{
"$match": {
"Id": "someId"
}
}, {
"$sort": {
"someNumericPropertyName": 1
}
}, {
"$unwind": {
"path": "$somePropertyName"
}
}], {
allowDiskUse: true
})
查询需要几毫秒才能完成。
ISODate属性是否存在任何排序问题?
我真的不明白为什么第一个版本需要这么长时间。
谢谢。
更新
这是查询结果,“explain”标志设置为true(注意:在ISODate字段上有一个索引):
{
"waitedMS" : NumberLong(0),
"stages" : [
{
"$cursor" : {
"query" : {
"StreamId" : "5b8cc895-c626-5994-95d4-b9ac89fb66ed"
},
"sort" : {
"CommitStamp" : 1
},
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "vrp-events-prod.Commits",
"indexFilterSet" : false,
"parsedQuery" : {
"StreamId" : {
"$eq" : "5b8cc895-c626-5994-95d4-b9ac89fb66ed"
}
},
"winningPlan" : {
"stage" : "FETCH",
"filter" : {
"StreamId" : {
"$eq" : "5b8cc895-c626-5994-95d4-b9ac89fb66ed"
}
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"CommitStamp" : 1
},
"indexName" : "CommitStamp_Index",
"isMultiKey" : false,
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 1,
"direction" : "forward",
"indexBounds" : {
"CommitStamp" : [
"[MinKey, MaxKey]"
]
}
}
},
"rejectedPlans" : []
}
}
},
{
"$unwind" : {
"path" : "$Events"
}
}
],
"ok" : 1
}
答案 0 :(得分:0)
根据我的经验,在日期字段上没有索引的日期排序很慢。假设您经常阅读此集合并通常按日期排序,添加索引将是理想的解决方案。
db.collection.createIndex(" someISODatePropertyName":1或-1)
尝试一下,它对我来说总是有很大的不同。
<强>更新强>
假设这并没有太大地减慢您的写入查询速度,请添加一个涵盖匹配和排序的索引:
db.xxx.createIndex({&#34; StreamId&#34;:1,&#34; CommitStamp&#34;:1});
我在我的集合上对此进行了测试,并将查询从15秒(使用日期索引)加速到不到一秒(使用新创建的索引)。仅供参考,我的最新解释显示:
var value = new ODataEnumValue( nEnumIntValue.ToString(), enumType.FullName() );
entity.TrySetPropertyValue( col.ColumnName, value );