MongoDB不允许使用'.' 在关键

ele*_*nor 18 python mongodb

我正在尝试保存包含特殊字符''的字典.在MongoDB的关键部分.错误如下所示,其中明确指出密钥不得包含特殊字符'.'.

>>> import pymongo
>>> client = pymongo.MongoClient('localhost')
>>> db = client['malware']                                                                                                                                                          
>>> test = db['test']
>>> d = {'.aaa' : '.bbb'}                                                                                                                                                           
>>> test.insert(d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.7/site-packages/pymongo/collection.py", line 362, in insert
    self.database.connection)
bson.errors.InvalidDocument: key '.aaa' must not contain '.'
Run Code Online (Sandbox Code Playgroud)

但我目前的信息包含'.' 在数据的关键部分,我需要存储到MongoDB.目前我只是删除'.' 从字符串中,另一个选项是用'_'或其他特殊字符替换它.

然而,所有这些都会导致信息丢失,因为如果我有一个密钥'.aaa'和一个密钥' aaa'并且我转换'.' 进入' '然后键完全一样,我丢失了一些信息.为什么Mongo不允许我将'.aaa'保存到数据库中?

任何想法如何处理问题?

Pad*_*ham 22

您可以check_keys根据来源设置为False :

 test.insert(d,check_keys=False)


 def insert(self, doc_or_docs, manipulate=True,
           safe=None, check_keys=True, continue_on_error=False, **kwargs):
Run Code Online (Sandbox Code Playgroud)

确实有效:

In [28]: d = {'.aaa' : '.bbb'}

In [29]: test.insert(d,check_keys=False)
Out[29]: ObjectId('54ea604bf9664e211e8ed4e6')
Run Code Online (Sandbox Code Playgroud)

docstring声明:

  • check_keys(可选):如果True检查键是否以'$'开头或包含'.',则提升:class:~pymongo.errors.InvalidName无论哪种情况.

你似乎可以分开使用任何字符只从两个 $.这样一个前导下划线或任何其他字符会被罚款和可能是一个更好的选择.

faq中有关于转义的信息:

在某些情况下,您可能希望使用用户提供的密钥构建BSON对象.在这些情况下,密钥需要替换保留的$和.字符.任何字符都足够了,但考虑使用Unicode全宽等价:U + FF04(即"$")和U + FF0E(即".").

点符号常见问题解释了为什么使用.不是一个好主意:

MongoDB使用点表示法来访问数组的元素并访问嵌入文档的字段.要通过从零开始的索引位置访问数组的元素,请将数组名称与点(.)和从零开始的索引位置连接起来,并用引号括起来:

  • 不推荐使用`insert()`,替换为`insert_one()`,它没有`check_keys`参数.它有一个`bypass_document_validation`参数,但这没有相同的效果,它仍然不会插入一个键中有一个点的文档. (6认同)
  • `check_keys`不再可用。 (4认同)