【问题标题】:mongodb (compund) index on hashmap field results in inconsistent (count) query resulthashmap 字段上的 mongodb (comund) 索引导致不一致的 (count) 查询结果
【发布时间】:2013-08-02 09:35:37
【问题描述】:

我有一个带有“ia”字段的文档,它是我的 java 实体中的一个 HashMap(带有键值对)。

mongo 文档 PlayerAttribute 看起来像这样

{
    "_id" : ObjectId("51f8c4cbcd757bd40da8a0c6"),
    "gameId" : "XYZ",
    "ia" : {
        "CrashesCount" : "0",
        "HardCurrencyOwned" : "7898",
        "LastNotificationsId" : "12",
        "Level" : "11",
        "PvpRacesPlayed" : "0",
        "PvpRaiting_FreeStyle" : "1200",
        "PvpRaiting_Motocross" : "1200",
        "PvpRaiting_SpeedAndStyle" : "1200",
        "PvpRaiting_StepUp" : "1200",
        "PvpRank" : "0"
    },
    "lastSessionExpireTime" : ISODate("2013-07-31T12:31:33.966Z"),
    "lastSessionStartTime" : ISODate("2013-07-31T12:31:27.975Z"),
    "name" : "abc123",
    type : null
}

这是集合的索引定义,

[
    {
            "v" : 1,
            "key" : {
                    "_id" : 1
            },
            "ns" : "player.PlayerAttribute",
            "name" : "_id_"
    },
    {
            "v" : 1,
            "key" : {
                    "effectiveDate" : 1
            },
            "ns" : "player.PlayerAttribute",
            "name" : "effectiveDate",
            "dropDups" : false,
            "sparse" : false
    },
    {
            "v" : 1,
            "key" : {
                    "endDate" : 1
            },
            "ns" : "player.PlayerAttribute",
            "name" : "endDate",
            "dropDups" : false,
            "sparse" : false
    },
    {
            "v" : 1,
            "key" : {
                    "gameId" : 1,
                    "name" : 1
            },
            "unique" : true,
            "ns" : "player.PlayerAttribute",
            "name" : "pa_gid_n_unique_idx"
    },
    {
            "v" : 1,
            "key" : {
                    "gameId" : 1,
                    "ia" : 1,
                    "name" : 1
            },
            "ns" : "player.PlayerAttribute",
            "name" : "pa_gid_iattr_n_idx"
    },
    {
            "v" : 1,
            "key" : {
                    "gameId" : 1,
                    "lastSessionExpireTime" : 1
            },
            "ns" : "player.PlayerAttribute",
            "name" : "pa_gid_lset_idx"
    }
]

这是我在 mongo shell 中使用的查询,

db.PlayerAttribute.find({"gameId":"XYZ", "attributes.CrashesCount" : "0"}).count();

第一次它给我的结果大于零(但这是不正确的。例如,如果有 7 个文档与查询匹配,它会说 6),下一次它给出 0,这发生在 5到 10 分钟。

大约 5 到 10 分钟后,它再次给出非零数(一次),接下来的几次它是零。

当我删除这个索引(“name”:“pa_gid_iattr_n_idx”)时,它总是给出正确的计数。

知道为什么 hashmap 字段上的索引 ("name" : "pa_gid_iattr_n_idx") 会导致 mongo 产生不正确和不一致的结果吗?

提前感谢您的回复。

【问题讨论】:

  • 请发布您正在使用的查询以及可能存在问题的整个代码块
  • 嗨,集合名称是 PlayerAttribute,这是我使用的查询,db.PlayerAttribute.find({"gameId":"XYZ", "attributes.CrashesCount": "0 "}).count(); 这也发生在 mongo shell 中,而不仅仅是代码中。
  • 我已经使用我使用的查询更新了我的原始帖子,其中包含准确的文档和索引定义。

标签: mongodb indexing hashmap field


【解决方案1】:

我不能完全解释为什么它有时会显示结果,有时不会。这听起来像是一个错误,所以请确保您运行的是最新的 MongoDB 版本(在撰写本文时为 2.4.5)。如果您仍然可以重现它,请在http://jira.mongodb.org/browse/SERVER 提交问题 - 确保提供显示问题的查询、索引创建和示例数据集。

【讨论】:

    【解决方案2】:

    我会尝试以下方法

    1. 删除并重新创建索引
    2. 通过运行 mongo 修复工具修复数据库
    3. 如果尚未安装,请升级到 mongo 2.4.5。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多