问题描述
您可以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):
它确实可以工作:
In [28]: d = {'.aaa' : '.bbb'}
In [29]: test.insert(d,check_keys=False)
Out[29]: ObjectId('54ea604bf9664e211e8ed4e6')
该文档字符串指出:
*
check_keys
(可选):如果True
检查键是否以’$’开头或包含’。’,则~pymongo.errors.InvalidName
在两种情况下都提高:class :。
你似乎可以分开使用任何字符只从两个 $
或.
因此导致下划线或任何其他字符会被罚款和可能是一个更好的选择。
常见问题解答中有关于转义的信息:
在某些情况下,您可能希望使用用户提供的密钥来构建BSON对象。在这种情况下,密钥将需要替换保留的$和。字符。任何字符都足够,但是请考虑使用Unicode全角等效项:U + FF04(即“ $”)和U + FF0E(即“。”)。
点号常见问题解释了为什么使用.
它不是一个好主意:
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 '.'
但是我当前的信息包含“。” 在数据的关键部分,我需要将其存储到MongoDB中。目前,我只是删除“。” 从字符串中,另一种选择是将其替换为“
_”或其他一些特殊字符。
但是,所有这些都会导致信息丢失,因为如果我有一个密钥’.aaa’和一个密钥’ aaa’,并且如果我转换了’。 输入“
”,则密钥完全相同,我丢失了一些信息。为什么Mongo不允许我将’.aaa’保存到数据库中?
任何想法如何解决这个问题?