1

哎哟!我在 MongoDB 上遇到了一个非常有趣的问题,而且可能更普遍地是在 JSON 上。基本上,我不小心创建了一些 MongoDB 文档,其子文档包含一个空键,例如(我剥离了ObjectIDs 以使代码看起来更好):

{ 
    "_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

2

我有着同样的问题。您可以使用以下内容选择子文档:

db.foo.find({"parameters.":{$exists:true}})

“参数”末尾的点告诉 Mongo 在该子文档中查找一个空键。这适用于 Mongo 2.4.x。

Mongo 不太支持空键,我不认为它们是官方支持的,但是您可以使用它们插入数据。因此,您不应该使用它们,而应该在系统中找到插入这些密钥的位置并将其删除。

于 2016-01-05T16:35:34.243 回答
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 回答