为了账号安全,请及时绑定邮箱和手机立即绑定

密钥名称中的MongoDB点(。)

/ 猿问

密钥名称中的MongoDB点(。)

慕雪6442864 2019-08-19 15:52:39

密钥名称中的MongoDB点(。)

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

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

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

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


查看完整描述

3 回答

?
慕运维1137616

MongoDB不支持带有点的键,因此您必须预先处理JSON文件以在导入之前删除/替换它们,否则您将为各种各样的问题做好准备。

这个问题没有标准的解决方法,最好的方法太依赖于具体情况。但是如果可能的话,我会避免使用任何关键的编码器/解码器方法,因为你将继续为永久性付出不便,因为JSON重组可能是一次性成本。


查看完整回答
反对 回复 2019-08-19
?
慕勒3428872

蒙戈文档建议替换非法字符,如$.他们的Unicode的等价物。

在这些情况下,密钥需要替换保留的$和。字符。任何字符都足够了,但考虑使用Unicode全宽等价:U + FF04(即“$”)和U + FF0E(即“。”)。


查看完整回答
反对 回复 2019-08-19
?
当年话下

正如其他答案中所提到的,由于字段名称的限制, 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转义语法中所述,但所描述的替换序列也可以正常工作。


查看完整回答
反对 回复 2019-08-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信