MongoDB no permite el uso de ‘.’ en clave

Estoy tratando de guardar un diccionario que contiene un carácter especial ‘.’ En la porción clave para el MongoDB. El error se presenta a continuación, que indica claramente que la clave no debe contener un carácter especial ‘.’.

>>> import pymongo >>> client = pymongo.MongoClient('localhost') >>> db = client['malware'] >>> test = db['test'] >>> d = {'.aaa' : '.bbb'} >>> test.insert(d) Traceback (most recent call last): File "", line 1, in  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 '.' 

Pero mi información actual contiene ‘.’ en la parte clave de los datos, que necesito almacenar en MongoDB. Actualmente estaba eliminando el ‘.’ de la cadena, otras opciones serían reemplazarlo con ‘_’ o algún otro carácter especial.

Sin embargo, todo resulta en la pérdida de información, porque si tengo una clave ‘.aaa’ y una clave ‘ aaa’ y si convierto ‘.’ en ‘ ‘ entonces las claves son exactamente iguales y pierdo información. ¿Por qué Mongo no me permite guardar el ‘.aaa’ en el DB?

¿Alguna idea de cómo abordar el problema?

Puede establecer check_keys en False según la fuente :

  test.insert(d,check_keys=False) def insert(self, doc_or_docs, manipulate=True, safe=None, check_keys=True, continue_on_error=False, **kwargs): 

De hecho funciona

 In [28]: d = {'.aaa' : '.bbb'} In [29]: test.insert(d,check_keys=False) Out[29]: ObjectId('54ea604bf9664e211e8ed4e6') 

El docstring establece:

  • check_keys (opcional): Si es True verifique si las claves comienzan con ‘$’ o contienen ‘.’, aumentando: class: ~pymongo.errors.InvalidName en cualquiera de los casos.

Parece que eres capaz de usar cualquier personaje aparte de solo los dos $ o . por lo tanto, un guión bajo o cualquier otro personaje estaría bien y probablemente sería una mejor opción.

Hay información en las preguntas frecuentes sobre el escape :

En algunos casos, es posible que desee crear un objeto BSON con una clave proporcionada por el usuario. En estas situaciones, las claves deberán sustituir los $ y los reservados. caracteres. Cualquier carácter es suficiente, pero considere utilizar los equivalentes de ancho completo de Unicode: U + FF04 (es decir, “$”) y U + FF0E (es decir, “.”).

Y las preguntas frecuentes sobre la notación de puntos explican por qué usar . no es una buena idea

MongoDB utiliza la notación de puntos para acceder a los elementos de una matriz y para acceder a los campos de un documento incrustado. Para acceder a un elemento de una matriz por la posición de índice de base cero, concatene el nombre de la matriz con el punto (.) Y la posición de índice de base cero, y encierre entre comillas:

No puede usar el ‘.aaa’ como su clave porque Mongo usa el punto para referirse a documentos nesteds .

Si desea que la clave se vea como un punto, puede usar un equivalente de Unicode como \u002E :

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

Sin embargo, sugeriría su enfoque de simplemente elegir otro personaje y aceptarlo como una “limitación” de la plataforma.