MongoDB не позволяет использовать '.'in key [дубликат]

этот вопрос уже есть ответ здесь:

Я пытаюсь сохранить словарь, содержащий специальный символ '. в ключевой части в 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' и если я конвертирую '."в" ' тогда ключи точно такие же, и я теряю некоторые информация. Почему Монго не позволяет мне спасти".aaa ' в DB?

есть идеи, как подойти к проблеме?

2 ответов


вы можете установить check_keys ложь по источник:

 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')

состояние docstring:

  • check_keys (необязательно): If True проверьте, начинаются ли ключи с'$' или содержать "., повышение :класс:~pymongo.errors.InvalidName в любом случае.

вы, кажется, можете использовать любой символ, кроме двух $ или . так ведущий подчеркивание или любой другой символ будет прекрасным и, вероятно, лучшим вариантом.

в faq есть информация о побег :

в некоторых случаях вы можете создать объект BSON с предоставленным пользователем ключом. В этих ситуациях ключи должны будут заменить зарезервированные $ and . письмена. Достаточно любого символа, но рассмотрите возможность использования эквивалентов полной ширины Unicode: U+FF04 (т. е. "$") И U+FF0E (т. е. ".").

и точка-нотация faq объясняет, почему с помощью . не очень хорошая идея:

MongoDB использует точечную нотацию для доступа к элементам массива и для доступа к полям внедренного документа. Чтобы получить доступ к элементу массива по нулевой позиции индекса, объедините имя массива с точкой (.) и нулевой позиции индекса, и заключают в кавычки:


вы не можете использовать '.aaa ' как ваш ключ, потому что Монго использует точку для ссылки на вложенных документов.

Если вы хотите, чтобы ключ выглядел как точка, вы можете использовать эквивалент unicode, например \u002E:

>>> d = {'\u002Eaaa' : '\u002Ebbb'}    

однако я бы предложил вам просто выбрать другого персонажа и принять его как "ограничение" платформы.