【问题标题】:How do I deal with dots in MongoDB key names?如何处理 MongoDB 键名中的点?
【发布时间】:2015-03-06 00:16:30
【问题描述】:

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

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

(类似于 npm 在沙发上做事的方式)

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

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

【问题讨论】:

  • 你是说你在 Mongo 中已经有这样的数据了吗?即使在更新之前,这也不应该是可能的。你用的是什么版本?
  • @Thilo 我不记得了,但可能是驱动程序有问题并允许它。
  • @c0deNinja 它允许我按版本名称查找,而无需遍历整个可能非常多版本的数组。
  • 那么你现在在数据库中有这样的数据吗?
  • @Thilo 是的,幸运的是这还没有投入生产

标签: javascript node.js mongodb


【解决方案1】:

你可以使用包含东西的版本集合吗?

喜欢:

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

【讨论】:

  • 除了这是一个无效对象之外,我还试图避免在此处迭代数组。
  • 是的,它是无效的,只是想知道一个数组是否可以工作。好的
【解决方案2】:

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

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

【讨论】:

  • 是的,我就是这么想的。这里的一个问题是这个应用程序的用户可以添加任何字符串作为版本,所以我没有一个可以使用的标准。与沙发之类的东西相比,在每次读取上执行这些操作所导致的速度下降会超过 mongo 的性能优势吗?我可能只是切换数据库,因为该项目目前处于早期开发阶段。
  • 其实这个好像测试起来会比较快,谢谢。
  • 您真的需要在文档版本中进行查询吗?您实际上可以在“版本”中存储一个 json 字符串,然后在加载/查看时手动解析它。对读取进行字符串处理可能不会减慢您的速度,Mongo 中的读取速度比 Couch 快得多。
  • 我基本上将所有内容都作为 API 公开,所以不幸的是,我必须在加载时正确解析它。我已经编写了替换例程,所以我想我会继续这样做。
猜你喜欢
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 1970-01-01
  • 2017-11-11
  • 2021-08-10
  • 1970-01-01
相关资源
最近更新 更多