Есть ли способ изменить имя поля MongoDB _id в MongoEngine с $ oid на $ id? - PullRequest
0 голосов
/ 07 февраля 2020

При запросе MongoDB с использованием mongoengine он возвращает результат с небольшими отличиями от того, что я ожидал. Одним из важных является $oid, который возвращается, но мне не нравится:

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

Есть ли способ проецировать по-другому в mongoengine? То, что я хочу, - это простое поле идентификатора:

"id": "5e3c0f7f284137537bf7c994"

EDIT1: Когда я хочу получить строковую версию ID, я могу использовать .id для получения, скажем, "5e3c0f7f284137537bf7c994". Но проблема в том, что я хочу получить весь документ:

MyModel.objects.all()

Этот запрос возвращает список всех документов из MyModel, НО список документов содержит $oid, а не строковую версию _id , Как я должен получить _id, а не $ oid.

1 Ответ

0 голосов
/ 09 февраля 2020

Вам необходимо использовать метод aggregate с оператором $ toString

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

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

Примечание: Это не вернет MyModel экземпляр, вы потеряете 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"}]
...