当密钥是空字符串时,如何访问MongoTemplate中的嵌入文档?

时间:2015-06-19 12:54:36

标签: mongodb mongotemplate

{
        "_id" : ObjectId("550add7ee0b4b54a3e7ad53c"),
        "day" : "14-03-2015",
        "node" : "2G",
        "nodeName" : "BLR_SGSN",
        "" : {
                "A" : 905.84,
                "B" : 261.34,
                "C" : 2103.94,
                "D" : 39.67
        }
}

我将此作为我在mongo中的数据。 如何获得A,B,C,D的值。 ??

1 个答案:

答案 0 :(得分:1)

您无法对此进行查询,因为无法选择子文档字段。

这只能是编程错误导致这样的事情(并且可能尝试在过程中计算密钥名称)的结果:

db.collection.insert({
    "": {
        "A": 1,
        "B": 2,
        "C": 3
    }    
})

因此,您无法通过标准查询方式获取子元素,如:

db.collection.find({ ".A": 905.84 })

您可以通过为这些方式更新受影响的集合中的文档,为其提供正确的密钥名称来解决此问题。但这当然是一个迭代过程。由于命名问题,不确定如何解决这个问题,而不是使用来自shell的JavaScript,但是:

db.collection.find({ "": { "$exists": true } }).forEach(function(doc) { 
    if ( doc.hasOwnProperty("") ) { 
        doc.newprop = doc[""]; 
       delete doc[""]; 
       db.collection.update({ "_id": doc._id }, doc );
    }
})

然后至少你可以通过新的" newprop"键(或任何你称之为):

db.collection.find({ "newprop.A": 905.84 })

同样的事情也适用于其他司机。

我的建议是"去解决这个问题"并找出导致此密钥名称首先为blank的代码。

应该有一个提交给MongoDB核心项目的错误报告,因为没有一个dirvers能够很好地处理这个问题。我以为我甚至可以在这里使用$rename,但你不能。

所以空白""键是一个需要修复的问题。