MongoDB не позволяет использовать '.'in key [дубликат]
этот вопрос уже есть ответ здесь:
- в MongoDB точка (.) в ключевом имени 15 ответов
Я пытаюсь сохранить словарь, содержащий специальный символ '. в ключевой части в 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
(необязательно): IfTrue
проверьте, начинаются ли ключи с'$' или содержать "., повышение :класс:~pymongo.errors.InvalidName
в любом случае.
вы, кажется, можете использовать любой символ, кроме двух $
или .
так ведущий подчеркивание или любой другой символ будет прекрасным и, вероятно, лучшим вариантом.
в faq есть информация о побег :
в некоторых случаях вы можете создать объект BSON с предоставленным пользователем ключом. В этих ситуациях ключи должны будут заменить зарезервированные $ and . письмена. Достаточно любого символа, но рассмотрите возможность использования эквивалентов полной ширины Unicode: U+FF04 (т. е. "$") И U+FF0E (т. е. ".").
и точка-нотация faq объясняет, почему с помощью .
не очень хорошая идея:
MongoDB использует точечную нотацию для доступа к элементам массива и для доступа к полям внедренного документа. Чтобы получить доступ к элементу массива по нулевой позиции индекса, объедините имя массива с точкой (.) и нулевой позиции индекса, и заключают в кавычки:
вы не можете использовать '.aaa ' как ваш ключ, потому что Монго использует точку для ссылки на вложенных документов.
Если вы хотите, чтобы ключ выглядел как точка, вы можете использовать эквивалент unicode, например \u002E
:
>>> d = {'\u002Eaaa' : '\u002Ebbb'}
однако я бы предложил вам просто выбрать другого персонажа и принять его как "ограничение" платформы.