2

我最近开始使用 Pymongo,现在我想找到在响应中删除 $oid 的最佳方法

当我使用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']

但我认为这不是最好的方法。希望大家有更好的解决方案。

4

4 回答 4

2
import re

def remove_oid(string):
    while True:
        pattern = re.compile('{\s*"\$oid":\s*(\"[a-z0-9]{1,}\")\s*}')
        match = re.search(pattern, string)
        if match:
            string = string.replace(match.group(0), match.group(1))
        else:
            return string

string = json_dumps(mongo_query_result)
string = remove_oid(string)
于 2021-11-21T15:18:01.873 回答
1

您可以利用聚合:

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

在这里,$addFields我添加了一个新字段Id,我在其中介绍了 的值oid。然后我做了一个投影,我消除了_id结果的领域。之后,当我得到一个光标时,我把它变成了一个列表。

它可能不会像您希望的那样工作,但总体思路就在那里。

于 2020-03-21T08:13:04.163 回答
1

首先,$oid响应中没有。您看到的是 python 驱动程序将该_id字段表示为 ObjectId 实例,然后该dumps()方法将 ObjectId 字段表示为字符串格式。该$oid位只是为了让您知道该字段是 ObjectId 如果您以后需要用于某些目的。

答案的下一部分取决于您要达到的目标。几乎可以肯定,您可以使用结果对象来实现它,而无需将其转换为 JSON。

如果你只是想完全摆脱它,你可以这样做:

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

这使:

{"name": "Archer"}
于 2020-03-21T11:10:39.780 回答
0

我正在使用某种形式的自定义处理程序。我设法删除$oid并仅用 id 字符串替换它:

# Custom Handler
def my_handler(x):
    if isinstance(x, datetime.datetime):
        return x.isoformat()
    elif isinstance(x, bson.objectid.ObjectId):
        return str(x)
    else:
        raise TypeError(x)

# parsing
def parse_json(data):
    return json.loads(json.dumps(data, default=my_handler))

result = db.nodes.aggregate([{'$match': {"name": "Archer"}}
                             {'$addFields': {"_id": '$_id'}},
                             {'$project': {'_id': 0}}])
data = parse_json(result)
于 2021-07-30T11:49:06.930 回答