Mongo - 如何保存在其字段名称中包含句点的文档?

时间:2014-11-11 00:41:15

标签: mongodb mongodb-query

我需要存储在Mongo数据库中的以下表单的文档:

{
    "a.1": 1,
    "b.2": [
        {"c.3": 3},
        {"d.4":4}
    ]
}

当我尝试将这样的文档插入到Mongo对象中时,因为Mongo不允许在字段名称中使用句点。我怎样才能最聪明地解决这个限制?

2 个答案:

答案 0 :(得分:1)

如上所述,MongoDB不允许这样做,因为它是为"dot notation"保留的,这是一种用于访问"子字段的表单"普通子文档或数组成员中的信息。考虑以下因素:

{
    "a": {
       "b": 1,
       "c": 2
    },
    "d": [{ "e": 1 },{ "e": 2 }],
    "f": ["a","b","c"]
}

在哪里设置字段值" b"在领域" a"你会这样做:

db.collection.update({},{ "$set": { "a.b": 2 } })

还有很多其他用途。在 $set 操作或其他更新运算符中特别有用,因为这允许单个元素,例如" a.b"设置在这里而不覆盖" a"的全部内容,例如

db.collection.update({},{ "a": { "b": 2, "c": 2 } })

还有很多其他有用的东西,匹配和增加位置:

db.collection.update({ "d.e": 2 },{ "$inc": { "d.$.e": 1 } })

设置数组的索引值:

db.collection.update({ }, { "$set": { "f.1": "d" } })

所以简而言之,我这样做甚至都没有尝试过。不要试图逃避"。"因为这只会给你带来麻烦。如果你需要使用一些非保留的东西,比如破折号" - "或者下划线" _"。

真的不确定你的目的。就个人而言,我习惯了几乎所有事情。唯一的另一个评论是,如果你试图做某种"版本控制"然后你会以错误的方式去做。这应该是"数据"的一部分。而不是字段名称。 MongoDB不喜欢在整个地方改变字段名称。所以虽然"灵活"在架构上,你应该保持大致相同的东西。

答案 1 :(得分:0)

  

在某些情况下,您可能希望使用a构建BSON对象   用户提供的密钥。在这些情况下,密钥需要替换   保留的$和。字符。任何角色都足够了,但是   考虑使用Unicode全宽等价物:U + FF04(即“$”)   和U + FF0E(即“。”)。

因此,您可以将\U+FF0E用于.

db.collection.insert({"field\uff0ename": "value"})
db.collection.find({"field\uff0ename": "value"})