嗨!我对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。
谢谢,
托马索
答案 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 } }