【问题标题】:Mongo Query of Record by Array Object Field Value Using JavaMongo使用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()方法吗?

标签: java mongodb


【解决方案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版本。我目前无法在我们的生产环境中更改它,因为它被指示在更改之前进行调查。我现在能做的最多的就是用当前的解释查询。
猜你喜欢
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 2017-06-15
  • 1970-01-01
  • 2019-02-06
相关资源
最近更新 更多