从 Pymongo 结果中删除 _id 元素

新手上路,请多包涵

我正在尝试使用 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:

 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 文档 解释说您可以排除 _id 与

{ _id : 0 }

但这对 pymongo 没有任何作用。 Pymongo 文档 解释说,您可以列出要返回的字段,但“(“_id”将始终包括在内)”。严重地?有没有办法解决这个问题?我在这里忽略了一些简单而愚蠢的事情吗?

原文由 ddw 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

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

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

该文档在这方面有些误导,因为它说 _id 字段始终包含在内。但是你可以像上面显示的那样排除它。

原文由 Thomas 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果我们想要特定字段并且仍然忽略 _id,则上述答案失败。在这种情况下使用以下内容:

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

原文由 srikar saggurthi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题