从Pymongo结果中移除_id元素(Removing _id element from Pymon

2019-07-31 11:12发布

我在尝试使用的MongoDB和瓶(使用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']

每个对象字典看起来我也喜欢现在的方式,但对象光标是空的。 所以我尝试创建一个新的字典,并从每个删除_id后,添加到新的字典,瓶将返回:

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’将始终包含)”。 真的吗? 请问有没有办法解决这个? 有什么简单而愚蠢,我俯瞰这里?

Answer 1:

为了排除_id在pymongo一个发现查询字段,你可以使用:

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

该文件是在这个有点missleading,因为它说的_id字段始终包含在内。 但是,您可以排除像上图所示。



Answer 2:

你在呼唤

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}


Answer 3:

以上回答如果我们想具体领域,仍然忽视_id失败。 使用在这种情况下如下:

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


文章来源: Removing _id element from Pymongo results