12

私はpymongoに取り組んでおり、これは私のドキュメントです:

{
   "_id": ObjectId("51211b57f07ddaa377000000"),
   "assignments": {
     "0": {
       "0": {
         "_id": ObjectId("5120dd7400a4453d58a0d0ec") 
      },
       "1": {
         "_id": ObjectId("5120dd8e00a4453d58a0d0ed") 
      },
       "2": {
         "_id": ObjectId("5120ddad00a4453d58a0d0ee") 
      } 
    } 
  },
   "password": "my_passwd",
   "username": "john" 
}

そのようなすべてのドキュメントの「割り当て」プロパティの設定を解除したいと思います。次のようにして、mongoシェルでこれを実現できました。

db.users.update({}, {$unset: {"assignments": 1}}, false, true)

つまり、upsert フラグと multi フラグを最後の 2 つのパラメーターとして、users コレクションの update 関数に渡しました。ただし、pymongoでこれを行いました:

db.users.update({}, {"$unset": {"assignments": 1}}, False, True)

しかし、Python インタープリターは次のようにエラーをスローしました。

File "notes/assignment.py", line 34, in <module>
    db.users.update({}, {"$unset": {"assignments": 1}}, False, True)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/collection.py", line 481, in update
    check_keys, self.__uuid_subtype), safe)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 852, in _send_message
    rv = self.__check_response_to_last_error(response)
  File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 795, in __check_response_to_last_error
    raise OperationFailure(details["err"], details["code"])
pymongo.errors.OperationFailure: Modifiers and non-modifiers cannot be mixed

どこが間違っていますか?

4

1 に答える 1

28

問題は、渡す 2 つのフラグが と ではないことupsertですmulti。PyMongo のドキュメントCollection.update(ここupsertにあります) に基づくと、確かではありませんが、およびmanipulateオプションの値を渡している可能性があるようです。

これを解決するには、Python の最も優れた機能の 1 つである名前付き引数を使用するだけです。に渡すオプションを指定することでupdate、このような事故が起こらないようにするだけでなく、コードを明確にすることができます。

この場合、オプションupsert=Falseとを渡しますmulti=True

db.users.update({}, { "$unset": { "assignments": 1 } }, upsert=False, multi=True)
于 2013-02-18T02:04:08.150 に答える