简体   繁体   中英

Remove attribute from all MongoDB documents using Python and PyMongo

In my MongoDB, a bunch of these documents exist:

{ "_id" : ObjectId("5341eaae6e59875a9c80fa68"),
  "parent" : {
      "tokeep" : 0,
      "toremove" : 0
  }
}

I want to remove the parent.toremove attribute in every single one.

Using the MongoDB shell, I can accomplish this using:

db.collection.update({},{$unset: {'parent.toremove':1}},false,true)

But how do I do this within Python?

app = Flask(__name__)
mongo = PyMongo(app)
mongo.db.collection.update({},{$unset: {'parent.toremove':1}},false,true)

returns the following error:

  File "myprogram.py", line 46
mongo.db.collection.update({},{$unset: {'parent.toremove':1}},false,true)
                               ^
SyntaxError: invalid syntax

$unset周围加上引号,命名你所包含的参数( multi )并使用正确的true语法:

mongo.db.collection.update({}, {'$unset': {'parent.toremove':1}}, multi=True)

Just found weird to have to attach an arbitrary value for the field to remove, such as a small number (1), an empty string (''), etc, but it's really mentioned in MongoDB doc, with sample in JavaScript:

$unset

The $unset operator deletes a particular field. Consider the following syntax:

{ $unset: { field1: "", ... } }

The specified value in the $unset expression (ie "") does not impact the operation.

For Python/PyMongo, I'd like to put a value None :

{'$unset': {'field1': None}}

So, for OP's question, it would be:

mongo.db.collection.update({}, {'$unset': {'parent.toremove': None}}, multi=True)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM