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通过数组对象字段值查询记录的主要内容,如果未能解决你的问题,请参考以下文章

通过布尔字段查询mongo集合

Mongo 查询(可视化工具)

mongodb查询,如何只查询出某一个字段的值?

mongo基本操作

通过mongo中的填充字段查询[重复]

Mongo - 通过_id更新嵌套的对象数组