使用& elemMatch内部数组优化查询

时间:2016-07-11 15:31:20

标签: mongodb

首先,我要为我的英语道歉。 我的查询性能存在严重问题。不幸的是,我对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,但它没有成功。任何建议都会非常有用。

0 个答案:

没有答案