首先,我要为我的英语道歉。
我的查询性能存在严重问题。不幸的是,我对mongoDB很新。所以我的集合test
看起来与此类似
{
"_id" : ObjectId("1"),
[...]
"statusHistories" : [
{
"created" : ISODate("2016-03-15T14:59:11.597Z"),
"status" : "STAT1",
},
{
"created" : ISODate("2016-03-15T14:59:20.465Z"),
"status" : "STAT2",
},
{
"created" : ISODate("2016-03-15T14:51:11.000Z"),
"status" : "STAT3",
}
],
}
statusHistories
是一个数组。
每天有超过3000条记录插入该集合中。
我想要实现的是找到所有已经给出状态的tests
并且它们是两个日期。所以我准备了这样的查询:
db.getCollection('test').find({
'statusHistories' : {
$elemMatch : {
created : {
"$gte" : ISODate("2016-07-11 00:00:00.052Z"),
"$lte" : ISODate("2016-07-11 23:59:00.052Z")
},
'status' : 'STAT1'
}
}
})
它给出了预期的结果。不幸的是,它需要大约120秒才能完成。哪个太长了。令人惊讶的是,如果我将此查询拆分为两个单独的分配,则会减少:
db.getCollection('test').find({
'statusHistories' : {
$elemMatch : {
created : {
"$gte" : ISODate("2016-07-11 00:00:00.052Z"),
"$lte" : ISODate("2016-07-11 23:59:00.052Z")
}
}
}
})
db.getCollection('test').find({
'statusHistories' : {
$elemMatch : {
'status' : 'STAT1'
}
}
})
为了完成它们,它们都需要不到一秒钟。
那么我对原始查询的错误是什么?我需要在一个查询中记录这些记录,但是当我将两个elemMatch语句组合成一个时需要很长时间。我尝试ensureIndex
statusHistories
,但它没有成功。任何建议都会非常有用。