有没有办法将 MongoEngine 中的 MongoDB _id 字段名称从 $oid 更改为 $id?

Is there a way to change MongoDB _id field name in MongoEngine from $oid to $id?

当使用 mongoengine 查询 MongoDB 时,它 returns 结果与我的预期略有不同。其中一个重要的是 $oid 返回但我不喜欢它:

  "_id": {
    "$oid": "5e3c0f7f284137537bf7c994"
  },

有没有办法在 mongoengine 中进行不同的投影?我想要的是一个简单的 id 字段:

"id": "5e3c0f7f284137537bf7c994"

编辑 1: 当我想获取 ID 的字符串版本时,我可以使用 .id 来获取 "5e3c0f7f284137537bf7c994"。但问题是我想从哪里获取整个文档:

MyModel.objects.all()

此查询 returns 来自 MyModel 的所有文档的列表,但文档列表包含 $oid 而不是 _id 的字符串版本。我应该如何获得 _id 不是 $oid.

您需要将 aggregate 方法与 $toString 运算符一起使用

pipeline = [
    {"$addFields" : {"_id" : {"$toString" : "$_id"} } }
]
data = MyModel.objects().aggregate(pipeline)

http://docs.mongoengine.org/guide/querying.html#mongodb-aggregation-api

注:这不会returnMyModel实例,你失去了mongoengine特征

但是,如果您不想丢失功能(仅适用于 to_json):

from bson import json_util, son
..

class MyModel(Document):
    content = StringField(required=True)
    #setup your attributes

    def to_json(self, *args, **kwargs):
        raw = self.to_mongo()
        tmp = [(k, str(raw[k]) if k == "_id" else raw[k]) for k in raw]
        return json_util.dumps(son.SON(tmp), *args, **kwargs)

...

# This returns <class 'mongoengine.queryset.queryset.QuerySet'>
data = MyModel.objects()

print(data[0])
print(data[0].to_json())

print(data.to_json())
print("[%s]" % ",".join([foo.to_json() for foo in data]))

----

MyModel object
{"_id": "5e400e737db7d0064937f761", "content": "foo"}

[{"content": "foo", "_id": {"$oid": "5e400e737db7d0064937f761"}}, {"content": "bar", "_id": {"$oid": "5e400e737db7d0064937f762"}}]
[{"_id": "5e400e737db7d0064937f761", "content": "foo"},{"_id": "5e400e737db7d0064937f762", "content": "bar"}]