我正在尝试使用MongoDB和Flask(使用pymongo驱动程序)创建Web服务。当然,对数据库的查询返回包含“_id”字段的文档。我不想将其发送给客户端,那么如何将其删除?
这是一个Flask路线:
@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:
TypeError: 'Cursor' object does not support item deletion
所以它不是字典,而是我必须将每个结果作为字典迭代。所以我试着用这段代码做到这一点:
for object in objects:
del object['_id']
每个对象字典看起来都是我现在喜欢的方式,但是对象光标是空的。所以我尝试创建一个新的字典,并在从每个字典中删除_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{ _id : 0 }
但这与pymongo毫无关系。 Pymongo documentation说明您可以列出要返回的字段,但“(”_id“将始终包括在内)”。真的吗?有没有办法解决这个问题?有什么简单而愚蠢的东西让我在这里俯瞰吗?
答案 0 :(得分:73)
要在pymongo中的查找查询中排除_id
字段,您可以使用:
db.collection.find({}, {'_id': False})
文档在这方面有些误导,因为它总是包含_id
字段。但你可以像上面所示那样排除它。
答案 1 :(得分:1)
您正在致电
del objects['_id']
光标对象上的!
游标对象显然是结果集上的可迭代而不是单个 你可以操纵的文件。
for obj in objects:
del obj['_id']
很可能是你想要的。
因此,您的声明完全错误,如下面的代码所示:
import pymongo
c = pymongo.Connection()
db = c['mydb']
db.foo.remove({})
db.foo.save({'foo' : 42})
for row in db.foo.find():
del row['_id']
print row
$ bin/python foo.py
> {u'foo': 42}
答案 2 :(得分:1)
如果我们想要特定的字段并且仍然忽略_id,则以上答案将失败。在这种情况下,请使用以下内容:
db.collection.find({'required_column_A':1,'required_col_B':1, '_id': False})