猿问
下载APP

密钥名称中的MongoDB点(。)

密钥名称中的MongoDB点(。)

似乎mongo不允许插入带点(。)或美元符号($)的键,但是当我使用mongoimport工具导入包含点的JSON文件时,它工作正常。司机抱怨试图插入该元素。

这是文档在数据库中的样子:

{
    "_id": {
        "$oid": "..."
    },
    "make": "saab",
    "models": {
        "9.7x": [
            2007,
            2008,
            2009,
            2010
        ]
    }}

我这样做是错误的,不应该使用像外部数据那样的哈希映射(即模型),还是可以以某种方式逃避点?也许我在想类似Javascript。


慕雪6442864
浏览 44回答 3
3回答

慕运维1137616

MongoDB不支持带有点的键,因此您必须预先处理JSON文件以在导入之前删除/替换它们,否则您将为各种各样的问题做好准备。这个问题没有标准的解决方法,最好的方法太依赖于具体情况。但是如果可能的话,我会避免使用任何关键的编码器/解码器方法,因为你将继续为永久性付出不便,因为JSON重组可能是一次性成本。

慕勒3428872

该蒙戈文档建议替换非法字符,如$和.他们的Unicode的等价物。在这些情况下,密钥需要替换保留的$和。字符。任何字符都足够了,但考虑使用Unicode全宽等价:U + FF04(即“$”)和U + FF0E(即“。”)。

当年话下

正如其他答案中所提到的,由于字段名称的限制, MongoDB不允许$或.字符作为映射键。但是,如美元符号运算符中所述,转义此限制并不会阻止您插入具有此类键的文档,它只会阻止您更新或查询它们。简单地更换问题.有[dot]或U+FF0E(如别处此页面上提到的),当用户合法想要存储密钥会发生什么[dot]或U+FF0E?Fantom的 afMorphia驱动程序采用的方法是使用类似于Java的unicode转义序列,但确保转义字符首先被转义。本质上,进行以下字符串替换(*):\  -->  \\ $  -->  \u0024.  -->  \u002e随后从 MongoDB 读取映射键时进行反向替换。或者在Fantom代码中:Str encodeKey(Str key) {     return key.replace("\\", "\\\\").replace("\$", "\\u0024").replace(".", "\\u002e")}Str decodeKey(Str key) {     return key.replace("\\u002e", ".").replace("\\u0024", "\$").replace("\\\\", "\\")}用户需要了解此类转换的唯一时间是构造对此类密钥的查询。鉴于dotted.property.names出于配置目的而存储在数据库中是很常见的,我认为这种方法比简单地禁止所有这样的映射键更可取。(*)afMorphia实际上执行完整/正确的unicode转义规则,如Java中的Unicode转义语法中所述,但所描述的替换序列也可以正常工作。
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答