Mongodb 使用&;elemMatch内部阵列

Mongodb 使用&;elemMatch内部阵列,mongodb,Mongodb,首先我要为我的英语道歉。 我对查询的性能有严重的问题。不幸的是,我对mongoDB还很陌生。因此,我有一个集合test,它看起来与此类似 { "_id" : ObjectId("1"), [...] "statusHistories" : [ { "created" : ISODate("2016-03-15T14:59:11.597Z"), "status" : "STAT1", },

首先我要为我的英语道歉。 我对查询的性能有严重的问题。不幸的是,我对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多条记录插入到该集合中。 我想要实现的是找到所有给定状态的
测试
,它们被分为两个日期。所以我准备了这样的查询:

    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并添加执行状态。您还可以提供您的系统详细信息吗?