我正在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"将始终包含在内)".认真地没办法吗?有什么简单而愚蠢的事情我忽略了吗?

推荐答案

要排除pymongo中查找查询中的_id字段,可以使用:

db.collection.find({}, {'_id': False})

文档在这方面有点误导,因为它说总是包含_id字段.但你可以像上面所示那样排除它.

Mongodb相关问答推荐

MongoDB 4.4如何使用未知密钥更新dict

在MongoDB查询中添加来自另一个集合的匹配文档的计数

在Mongoose中对嵌套文档设置时间戳,但不对父文档设置时间戳

多键索引,性能问题

如何在 mongodb golang 的单个更新调用中使用 $set 和 $inc?

嵌套数组 $unwind 和 $group 在 mongoDB 中重新组合在一起

从 MongoDB find() 结果集中识别最后一个文档

使用 mgo 存储嵌套 struct

$lookup 结果 mongodb 的计数

mongo php副本连接非常慢

Mongoose 是否真的验证了对象 ID 的存在?

Mongoimport json 文件更新或覆盖..?

如何在 MongoDB Map-reduce 映射函数中使用变量

在 MongoDB 中插入或更新许多文档

在 Mongo 中,$near 和 $nearSphere 有什么区别?

未找到 MongoDB 数据/数据库

何时使用Singleton单例、Transient和使用 Ninject 和 MongoDB 的请求

是否可以在 Mongodb 中的两个数据库之间进行 $lookup 聚合?

PyMongo 创建具有 2 个或更多字段的唯一索引

Hadoop Map/Reduce 与内置 Map/Reduce