2017-05-29 11 views
0

それらをアーカイブし、削除するために、私は2つのコレクションがあります。のMongoDB - 移動文書が元のコレクションから

  • A(オリジナル)
  • B(アーカイブ)

を私はすべてのドキュメントを移動したいです、いくつかの条件に合致するコレクションB(アーカイブ)およびコレクションAの元の文書を削除します。私は、Pythonを使用し、これまでのところ、私はこれを持っている:

db.A.aggregate([{"$match": {"$and": [{"attribute1": False}, {"attribute2": False}]} }, {"$out": "B"} ]) 

db.A.deleteMany({"$and": [{"attribute1": False}, {"attribute2": False}]}) 

どちらのコマンドは動作しますが、私はそれがまた、アーカイブB.で新しいドキュメントを削除コレクションAにdeleteManyを呼び出すときに、私はMongoの1つのオブジェクトと共有のようにそれを保持して推測します何らかのポインタがあり、それが両方のコレクションから削除される理由です。どのようにそれを解決するための任意のアイデア? Python用

+1

ありません、それはしていません。 MongoDBには、どのような種類の「共有ポインタ」もありません。しかし、私はあなたが実際に具体的にそれが "上書き"すると言っている['$ out'](https://docs.mongodb.com/manual/reference/operator/aggregation/out/)の文書を読んでいないと思いますコレクション。したがって、すべての呼び出しは以前にあったコンテンツを削除し、そのコンテンツには「追加」しません。そして、それはあなたが見ている "実際の"行動です。 –

+1

また、ここでは '$と'の無駄な使い方があります。 MongoDBのクエリ引数は "既に" ** AND **の条件です。 '{" attribute1 ":False、" attribute2 ":False}'はまったく同じことを行いますが、読みやすく理解するためにはっきりしています。 –

+0

あなたは正しいです。それを適切に行う方法はありますか?私が必要とするように働く、$ outのためのあらゆる異なるコマンドを意味しますか? – EdWood

答えて

0

解決策:

documents = db.A.find({"attribute1": False, "attribute2": False}) 
if documents.count() != 0: 
    db.B.insert_many(documents) 
    db.A.remove({"attribute1": False, "attribute2": False}) 
関連する問題