我的mongo系列中有1900万条记录。我的收藏品格式为:
{
"_id" : ObjectId("5992d5a5e7f31a5e90abb881"),
"_class" : "com.abc.Try",
"field1_code" : "mycode_sdsvmnsbd7986fskljfnsv89s7fmnslfsd78",
"field2_id" : "5992d5a5e7f31a5e90abb87e",
"field3_id" : NumberLong(1681703),
"field4_id" : NumberLong(40119344),
"field5_create_date" : ISODate("2015-05-15T09:17:46.000Z"),
"field6_update_date" : ISODate("2015-05-31T08:53:59.000Z"),
"field7_status" : "active",
"field8_status" : "active"
}
我正在使用Spring批处理:org.springframework.batch.item.ItemReader<MyCollection>
阅读我的收藏,但它的阅读速度很慢。所以我使用命令创建了一个新索引:
db.monitoring_profile.createIndex({ field7_status: 1, field8_status: 1, field4_id: 1})
仍然很慢。请建议。我相信它是mongodb索引的一个问题。
我的Mongo查询是:
{'field7_status': 'active', 'field8_status' : 'active', 'field4_id': { $in: [.... 10000 values....] }}
我的解释查询结果是:
db.coll.find({'field7_status': 'active', 'field8_status' : 'active', 'field4_id': { $in: [40009361, 40006884] }}).explain()
{
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "mycollection.coll",
"indexFilterSet" : false,
"parsedQuery" : {
"$and" : [
{
"field7_status" : {
"$eq" : "active"
}
},
{
"field8_status" : {
"$eq" : "active"
}
},
{
"field4_id" : {
"$in" : [
40006884.0,
40009361.0
]
}
}
]
},
"winningPlan" : {
"stage" : "EOF"
},
"rejectedPlans" : []
},
"serverInfo" : {
"host" : ".......",
"port" : 27017,
"version" : "3.4.2",
"gitVersion" : "........"
},
"ok" : 1.0
}
答案 0 :(得分:0)
Explain的获胜计划看起来很奇怪。也许您可以尝试使用$而不是$ in来定义范围。例如范围(20,60):
db.test.find({'field7_status': 'active', 'field8_status' : 'active', $and : [{'field4_id' : {$gt : 20}, }, {'field4_id' : {$lt : 60}, }] })
答案 1 :(得分:0)
谢谢大家问题已解决。实际上问题不在于索引,因为@Neil认为$ in是那里的罪魁祸首。我用$ lookup替换了$ in(参见MongoDb Post formatting of $lookup aggregation with limited data),我得到了结果。 谢谢@neil和其他人。