使用汉语翻译这个英文标题,并且不包含任何特殊字符或引号:'Pymongo在字段名称中转义Unicode字符'

2024-10-03 04:36:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我在MongoDB中存储了以下示例键值对(以及许多类似的对):

"Cl\uff0eG_bibcode": 'some value'

之所以这样存储,是因为MongoDB不接受密钥名中的点。到目前为止,使用unicode版本的dot没有问题,但是我已经开始使用pymongo从我的数据库中拉入数据,它似乎正在从uff0e中转义。因此,当我在代码中看到它时,它是这样出现的:

^{pr2}$

我注意到,如果\uff0e在值中,只有在键中,它才会执行此操作。我也不会在Mongo和我的代码之间操作数据。我要做的就是:

url = 'mongodb://user:passwd@host/database'
client = MongoClient(url)
db = client.get_default_database()
collection = db['my_collection']
results = collection.find().limit(1) #just grabbing any record to test

我想了解一下如何让pymongo停止在密钥名中转义unicode字符。我真的不想把我所有的结果都看一遍然后手工处理掉。在


Tags: 数据代码clienturl示例dbclmongodb
2条回答

假设您在这里使用的是python 2.x,请使用unicode键:

>>> c.foo.bar.insert({u'Cl\uff0eG_bibcode': 'some value'})
ObjectId('5488fe8dfba52249d72069bf')
>>> doc = c.foo.bar.find_one()
>>> doc
{u'_id': ObjectId('5488fe8dfba52249d72069bf'), u'Cl\uff0eG_bibcode': u'some value'}   
>>> for key in doc:
...     print key.encode("utf-8")
... 
_id
Cl.G_bibcode

插入过程中,您使用的上一个驱动程序可能正在转义。在我的mongoshell中完成后,下面显示没有编码。在

db.Junk.insert({"Cl\uff0eG_bibcode": "some value"})
db.Junk.find()
{ "_id" : ObjectId("5487e53c64316c4cb2442578"), "Cl.G_bibcode" : "some value" }

这样就可以从shell中显示出您的结果。在

^{pr2}$

你直接通过shell插入数据了吗?在

Btw点在密钥名中被接受,但它们被解释为dot notation,因此被视为子文档。例如,“user.\u id”的密钥将被解释为the _id key inside the object (value) associated with the user key

{ _id: value
  key1: "str_value",
  key2: 12345,
  user: { _id: xxx, name: xxxx}
}

两个建议。 a) 为什么不使用管道|或其他一些简单但不可信的令牌(不太可能在任何普通密钥中使用)令牌。b) 我建议破解BSON文件,为你的时髦钥匙内置一个编码器/解码器。可能在这个文件里。https://github.com/mongodb/mongo-python-driver/blob/master/bson/init.py

相关问题 更多 >