如何处理MongoDB密钥名称中的点?

时间:2012-07-19 01:22:21

标签: javascript node.js mongodb

我正在Node和MongoDB中开发这个软件,其中我基本上想要存储具有以下结构的软件包版本:

{
    "versions":
    {
        "1.2.3": { stuff }
    }
}

(类似于npm如何在沙发上做事)

问题在于,当我更新MongoDB时,我发现它不允许键名中的点(由于点符号存在),导致我的代码失败。研究完之后,我所能找到的就是你需要在存储到数据库之前将点转换为其他字符,然后在访问时再将它们转换回来。真的没有更好的方法来解决这个问题吗?

如果没有,如何在不将数据复制到另一个密钥并删除原始文件的情况下进行此转换?

2 个答案:

答案 0 :(得分:4)

你可以使用带有东西的版本集合吗?

像:

{
    "versions":
    [
              {
                   "version_num": "1.2.3",
                   "stuff": { stuff }
              },
              {
                   "version_num": "1.2.4",
                   "stuff": { stuff }
              }
    ]
}

答案 1 :(得分:2)

点限制目前是驱动程序强制执行的,并非所有驱动程序从一开始就阻止了字段名称中的点。您可以编写原始协议代码来处理Mongo中的各种疯狂内容,包括在集合名称中使用非常奇怪的字符。

如果你清理它会更好(可能用 - 或其他一些有效字符替换点),但是使用任何类型的智能过滤都很难做到这一点。您很可能需要遍历整个集合,在应用程序中挖掘值,然后覆盖文档中的整个“版本”字段。因为它们不会调整文档的大小,并且可能不会更改任何索引,所以应该合理地快速执行覆盖。