MongoDB:如何选择空键子文档?

时间:2013-05-15 08:17:17

标签: json mongodb string

嗨!我对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问题跟踪器上提交了issue

谢谢,
托马索

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分: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 } }