配置pymongo使用字符串_id而不是ObjectId

bla*_*neh 5 mongodb pymongo meteor

我正在使用pymongo来自不同系统的旧信息来播种数据库,我有很多这样的查询:

studentId = studentsRemote.insert({'price': price})
Run Code Online (Sandbox Code Playgroud)

在实际的python脚本中,它studentId打印为一个字符串,但在javascript Meteor应用程序中,我正在使用这些数据,它在任何地方都显示为ObjectId(...).

我想配置pymongo生成_id一个字符串而不打扰ObjectId

我使用Meteor规范创建的任何对象都将使用字符串格式,而不是ObjectId格式.我不希望在我的应用程序中混合使用id类型,因为它导致了我的互操作性问题.

我知道我可以从Meteor创建ObjectId但坦率地说我更喜欢使用字符串格式.它是Meteor默认的,它更简单,我找不到任何有理由在我的特定应用程序中使用ObjectId.

valueOf()蒙戈功能或类似的东西可以解析_id和使用,一旦它在数据库中更新文件,但它会是不错的东西更直接.

小智 5

在.py文件中:

from bson.objectid import ObjectId
......
kvdict['_id'] = str(ObjectId())
......
mongoCollection.insert(kvdict)
Run Code Online (Sandbox Code Playgroud)

没关系!


bla*_*neh 4

结果变得相当简单。

son_manipulator模块可用于将传入文档更改为不同的形式。大多数时候,这用于对自定义对象进行编码,但它也适用于此。

操纵器就位后,只需调用str()ObjectId 上的函数即可进行转换。

from pymongo.son_manipulator import SONManipulator
class ObjectIdManipulator(SONManipulator):
    def transform_incoming(self, son, collection):
        son[u'_id'] = str(son[u'_id'])      
        return son

db.add_son_manipulator(ObjectIdManipulator())
Run Code Online (Sandbox Code Playgroud)