programing

Pymongo 결과에서 _id 요소 제거

powerit 2023. 5. 18. 21:30
반응형

Pymongo 결과에서 _id 요소 제거

저는 MongoDB와 Flask를 사용하여 웹 서비스를 만들려고 합니다(Pymongo 드라이버 사용).물론 데이터베이스에 대한 쿼리는 "_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)

이렇게 하면 1단계 키가 포함된 사전만 반환되고 다른 키는 반환되지 않습니다.

그래서 이것은 일종의 표준 중첩 사전 문제이지만, 저는 또한 MongoDB가 이것을 쉽게 다룰 방법이 없다는 것에 충격을 받았습니다.

MongoDB 문서에서는 _id를 제외할 수 있다고 설명합니다.

{ _id : 0 }

하지만 그것은 피몽고와 아무런 관련이 없습니다.Pymongo 문서에서는 반환할 필드를 나열할 수 있지만 "("_id"는 항상 포함됩니다)"라고 설명합니다.진짜로?이 일을 피할 방법이 없나요?내가 여기서 간과하고 있는 단순하고 멍청한 것이 있습니까?

제외하기_idpymongo의 찾기 쿼리 필드에서 다음을 사용할 수 있습니다.

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

문서는 다음과 같이 말하고 있기 때문에 이것에 대해 다소 오해를 불러일으킵니다._id필드는 항상 포함됩니다.그러나 위와 같이 제외할 수 있습니다.

특정 필드를 원하지만 _id를 무시하면 위의 답변은 실패합니다.이러한 경우 다음을 사용합니다.

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

전화를 걸겠습니다.

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}

언급URL : https://stackoverflow.com/questions/12345387/removing-id-element-from-pymongo-results

반응형