1

アホイ!私は MongoDB で非常に面白い問題を抱えており、おそらくより一般的には JSON で問題を抱えています。基本的に、サブドキュメントに空のキーが含まれる MongoDB ドキュメントを誤って作成してしまいましたObjectID

{ 
    "_id" : ObjectId("..."), 
    "stats" : 
        { 
            "violations" : 0, 
            "cost" : 170, 
        }, 
    "parameters" : 
        { 
            "" : "../instances/comp/comp20.ectt", 
            "repetition" : 29, 
            "time" : 600000 
        }, 
    "batch" : ObjectId("..."), 
    "system" : "Linux 3.5.0-27-generic", 
    "host" : "host3", 
    "date_started" : ISODate("2013-05-14T16:46:46.788Z"), 
    "date_stopped" : ISODate("2013-05-14T16:56:48.483Z"), 
    "copy" : false
}

もちろん、問題は次の行です。

"" : "../instances/comp/comp20.ectt"

フィールドの値を取り戻すことができないためです。次を使用してクエリを実行する場合:

db.experiments.find({"batch": ObjectId("...")}, { "parameters.": 1 })

私が得るのは、サブドキュメントの完全なコンテンツですparameters。私の推測では.、空のセレクターが続く場合、おそらく無視されます。JSON仕様 (15.12.*) から、空のキーが許可されているようです。それを解決する方法についてのアイデアはありますか?

それは既知の動作ですか?その用途はありますか?

更新フィールドに試してみまし$renameたが、同じ理由でうまくいきません。で終わるキー.は使用できません。

MongoDB イシュー トラッカーに提出されたイシューを更新します。

ありがとう、
トマソ

4

2 に答える 2

0

コードを確認したところ、あなたが言及した理由により、これは現在可能ではないようです。長さゼロのフィールド名を持つドキュメントを作成することが許可されているので、これはバグだと思います。ここで報告できます: https://jira.mongodb.org

ところで、皮肉なことに、それに対してクエリを実行できます。

> db.c.save({a:{"":1}})
> db.c.save({a:{"":2}})
> db.c.find({"a.":1})
{ "_id" : ObjectId("519349da6bd8a34a4985520a"), "a" : { "" : 1 } }
于 2013-05-15T08:56:10.250 に答える