我正在try 使用MongoDB和Flask(使用pymongo驱动程序)创建一个web服务.当然,对数据库的查询会返回包含"_id"字段的文档.我不想把它发送给客户,那么我该如何删除它呢?
以下是一条路由:
@app.route('/theobjects')
def index():
objects = db.collection.find()
return str(json.dumps({'results': list(objects)},
default = json_util.default,
indent = 4))
这将返回:
{
"results": [
{
"whatever": {
"field1": "value",
"field2": "value",
},
"whatever2": {
"field3": "value"
},
...
"_id": {
"$oid": "..."
},
...
}
]}
我以为这是一本字典,我可以在返回之前删除元素:
del objects['_id']
但这会返回一个类型错误:
TypeError: 'Cursor' object does not support item deletion
所以它不是一个字典,而是一个我必须迭代的东西,每个结果都是一个字典.所以我试着用下面的代码来实现这一点:
for object in objects:
del object['_id']
每个对象字典现在看起来都像我希望的那样,但对象光标是空的.因此,我try 创建一个新字典,在从每个字典中删除_id后,添加到Flask将返回的新字典中:
new_object = {}
for object in objects:
for key, item in objects.items():
if key == '_id':
del object['_id']
new_object.update(object)
它只返回一个包含第一级键的字典,其他什么都没有.
这是一个标准的嵌套字典问题,但我也很震惊MongoDB没有一个简单的方法来处理这个问题.
MongoDB documentation解释了你可以用
{ _id : 0 }
但这对pymongo没有任何作用.Pymongo documentation解释说,您可以列出想要返回的字段,但"("_id"将始终包含在内)".认真地没办法吗?有什么简单而愚蠢的事情我忽略了吗?