有没有办法将 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"}]
当使用 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"}]