Pymon go: лучший способ удалить $ oid в Response - PullRequest
0 голосов
/ 21 марта 2020

Я недавно начал использовать Pymon go, и теперь я хочу найти лучший способ удаления $ oid в Response

Когда я использую find:

result = db.nodes.find_one({ "name": "Archer" }

И получить ответ:

json.loads(dumps(result))

Результат будет:

{
  "_id": {
  "$oid": "5e7511c45cb29ef48b8cfcff"
  },
  "about": "A jazz pianist falls for an aspiring actress in Los Angeles."
}

Мое ожидаемое:

{
  "_id": "5e7511c45cb29ef48b8cfcff",
  "about": "A jazz pianist falls for an aspiring actress in Los Angeles."
}

Как вы видели, мы можем использовать:

resp = json.loads(dumps(result))
resp['id'] = resp['id']['$oid']

Но я думаю, что это не лучший способ. Надеюсь, у вас есть лучшее решение.

Ответы [ 2 ]

1 голос
/ 21 марта 2020

Прежде всего, в ответе нет $oid. Вы видите, что драйвер python представляет поле _id как экземпляр ObjectId, а затем метод dumps() представляет поле ObjectId в виде строкового формата. бит $oid предназначен только для того, чтобы вы знали, что поле является ObjectId, если вам понадобится использовать его для каких-то целей позже.

Следующая часть ответа зависит от того, чего именно вы пытаетесь достичь. Почти наверняка вы можете получить его, используя объект результата, не конвертируя его в JSON.

Если вы просто хотите полностью избавиться от него, вы можете сделать:

result = db.nodes.find_one({ "name": "Archer" }, {'_id': 0})
print(result)

, что дает :

{"name": "Archer"}
1 голос
/ 21 марта 2020

Вы можете воспользоваться преимуществом агрегации:

result = db.nodes.aggregate([{'$match': {"name": "Archer"}}
                             {'$addFields': {"Id": '$_id.oid'}},
                             {'$project': {'_id': 0}}])
data = json.dumps(list(result))

Здесь, с помощью $addFields я добавляю новое поле Id, в которое я ввожу значение oid. Затем я делаю проекцию, где исключаю поле _id результата. После того, как я получаю курсор, я превращаю его в список.

Он может работать не так, как вы надеетесь, но общая идея есть.

...