Mongo使用Java通过数组对象字段值查询记录
Posted
技术标签:
【中文标题】Mongo使用Java通过数组对象字段值查询记录【英文标题】:Mongo Query of Record by Array Object Field Value Using Java 【发布时间】:2020-05-08 00:11:35 【问题描述】:我收集了一个名为“工作”的文档:
"_id": "4bb131682d0682845098eabe",
"jobId": "1403610",
"refmdList": [
"_id": "4bb11af1f8d48284e0b2ef87",
"addrIdx": 1,
"type": "primary"
],
"status": "Created in J4",
Java 代码用于查找该作业文档:
private DBCursor getRefMdCursor(String refId)
DB db = JDatabase.getDatabase();
BasicDBObject search = new BasicDBObject();
search.put("refmdList._id", refId);
DBCollection col = db.getCollection("jobs");
DBCursor cur = col.find(search);
return cur;
这非常慢,并且 refmdList._id 没有被索引。是索引这个数组对象字段以加快它的解决方案还是上面的 DBCursor 代码有问题?
DBCursor 类来自 mongodb/mongo-java-driver/3.4.3/mongo-java-driver-3.4.3.jar
【问题讨论】:
有多少条记录匹配这个查询?你试过.toArray()方法吗? 【参考方案1】:数组的子文档字段可以被索引,这些索引称为Multikey索引。见Index Arrays with Embedded Documents。
字段refmdList._id
可以被索引。它可以使用该字段作为过滤条件来提高查询的性能。
关于 Java 代码:
您正在使用的 MongoDB Java 驱动程序 是旧版本 (3.4.3),并且有可用的最新版本 (3.12.0)。此外,可以更改 Java 代码以使用更新的 API;请参阅Find Operations 的示例。
【讨论】:
感谢您提供的信息,这很有帮助。集合中的记录数量约为 600 万,所以我认为这会有所作为。你同意?至于 MongoDB Java 驱动程序,我不确定更新到最新版本是否会对特定问题有益,但感谢您提供的信息。我们也可以实施。 索引肯定有助于提高查询性能。以“executionStats”模式运行explain
查询并验证查询计划 - 这将确认正在使用索引。实际上在索引之前和之后运行查询计划并验证差异。你能告诉你正在使用哪个版本的 MongoDB 吗?
集群显示的似乎是3.6.16版本。我目前无法在我们的生产环境中更改它,因为它被指示在更改之前进行调查。我现在能做的最多的就是用当前的解释查询。以上是关于Mongo使用Java通过数组对象字段值查询记录的主要内容,如果未能解决你的问题,请参考以下文章