在MongoDB的键中插入带有`.`的JSON文档


14

首先,这更多的是设计问题,而不是编程问题。

我正在创建一个应用程序,在其中我必须获取现有的JSON数据并将其插入MongoDB。我发现某些JSON文档.的密钥中有一个句点。我在MongoDB文档中读到,在MongoDB .中不允许将句点用作键,因为它们用于查询。

我在Web应用程序中没有做很多插入,这几乎是一次插入。另外,我主要会检索整个文档,而不是查询部分文档,因为我需要获取所有数据。

因此,考虑到我的需求,关于如何存储JSON文档,我有两种选择:

  1. 在JSON中搜索密钥中的句点并转义,然后将其插入MongoDB。
  2. 将整个JSON转换为BSON格式并按原样存储它们,从而避免转义的需要,并在需要时在MongoDB外部手动解析JSON

您能否告诉我哪种设计更好,因为我无法得出结论。


解决此问题的一种方法是使用insert方法,并将check_keys参数设置为false。另一种方法是遍历文档,并用其他东西或等效的unicode字符(嗯,字符)替换每次出现的点。
挪亚

Answers:


3

有几种选择:

1.用破折号代替点。

这将是我最喜欢的方法,因为它可以使结构足够明确。

由于根据您的说法,“这几乎是一次插入”,因此检查它是否没有破坏任何东西(即已经有一个破折号的键)应该相对简单。对于其他情况,以编程方式进行这些检查需要编写一些代码,但这仍然是相对容易的任务。

2. 用Unicode点字符(例如U + FF0E)替换点

我强烈建议您不要使用这种方法,因为它会导致大量的调试麻烦。让在代码远离MongoDB的某个地方使用结果JSON的人猜测点实际上不是点是一种浪费某人数周时间的好方法。将此类Unicode技巧保留给想要诱使某人认为某个字符不同的黑客。

3.使用BSON。

由于您声称自己“将主要检索整个文档,而不是查询文档的一部分”,因此这种方法在您的情况下没有主要缺点。尽管您说的是“大部分”,这意味着有时您只会检索文档的一部分。

通常,缺点是您将无法搜索文档或仅加载文档的一部分。

4.使用标准编码,例如Base64。

将有问题的键(或所有键,取决于有问题的和无问题的键之间的比率)转换为Base64或十六进制可能是一个可行的解决方案,其好处是非常明确:大多数开发人员一眼就能识别Base64或十六进制值。

缺点是增加了内存占用,并且在使用密钥时需要对密钥进行编码和解码。

5. 设置check_keysfalse

我强烈建议您不要使用这种方法,因为这样做会使数据查询变得模棱两可,并浪费数小时或数天来试图弄清楚为什么某个特定查询没有按照您的想象做。点是保留字符,支票是为了保护您;通过告诉MongoDB跳过检查,您只会推迟必须处理MongoDB语法与键中使用的保留字符之间的冲突的时间。


0

只需使用BSON。然后,您将拥有格式齐全的文档格式,以及经过良好测试的库支持,最重要的是,您可以进行转换(编码/解码)而不会造成任何损失。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.