Mongodb 使用&;elemMatch内部阵列
首先我要为我的英语道歉。 我对查询的性能有严重的问题。不幸的是,我对mongoDB还很陌生。因此,我有一个集合Mongodb 使用&;elemMatch内部阵列,mongodb,Mongodb,首先我要为我的英语道歉。 我对查询的性能有严重的问题。不幸的是,我对mongoDB还很陌生。因此,我有一个集合test,它看起来与此类似 { "_id" : ObjectId("1"), [...] "statusHistories" : [ { "created" : ISODate("2016-03-15T14:59:11.597Z"), "status" : "STAT1", },
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多条记录插入到该集合中。
我想要实现的是找到所有给定状态的测试
,它们被分为两个日期。所以我准备了这样的查询:
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语句合并到一个查询中时,需要花费很长时间。我试图在
statusHistories
上ensureIndex
,但没有成功。任何建议都会很有帮助。请检查一下,您是否使用复合索引?虽然较新的mongo版本支持索引交叉,但我不确定它们的工作情况如何。请参阅pkt 2并添加执行状态。您还可以提供您的系统详细信息吗?请检查,您是否使用复合索引?虽然较新的mongo版本支持索引交集,但我不确定这些版本的工作情况如何。请参阅pkt 2并添加执行状态。您还可以提供您的系统详细信息吗?