1

フィールド「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 シェルから使用したクエリです。

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

初めてゼロより大きい結果が得られます (ただし、これは正しくありません。たとえば、クエリに一致するドキュメントが 7 つある場合は 6 と表示されます)。その後は 0 が返され、これが 5 ~ 10 分間発生します。 .

約 5 ~ 10 分後、ゼロ以外の数値が再び表示され (1 回)、次の数回はゼロになります。

このインデックス ("name" : "pa_gid_iattr_n_idx") を削除すると、常に正しいカウントが得られます。

hashmap フィールド ("name" : "pa_gid_iattr_n_idx") のこのインデックスにより、mongo が不正確で一貫性のない結果を生成する理由は何ですか?

返信ありがとうございます。

4

2 に答える 2

0

私は次のことを試します

  1. インデックスの削除と再作成
  2. mongo修復ツールを実行してデータベースを修復します
  3. mongo 2.4.5 にまだアップグレードしていない場合は、アップグレードします。
于 2013-08-02T22:02:43.137 に答える
0

結果が表示される場合と表示されない場合がある理由を完全に説明することはできません。これはバグのように聞こえるので、最新の MongoDB バージョン (これを書いている時点では 2.4.5) を実行していることを確認してください。それでも再現できる場合は、http://jira.mongodb.org/browse/SERVERで問題を報告してください。問題を示すクエリ、インデックス作成、およびサンプル データ セットの両方を提供してください。

于 2013-08-02T19:01:51.240 に答える