web-dev-qa-db-ja.com

pymongo update_one()、upsert = $演算子を使用しないTrue

次の形式のドキュメントがあります。

{"hostname": "myhost1.com", "services": { ... } }

私がしたいことは次のとおりです:

dataset = requests.get('http://endpoint.com/hardware.json').json()
for hostname, services in dataset[0].items():
    db.titleHardware.update_one({'hostname':hostname},
                                {services.keys()[0]: services.values()[0]}, 
                                True) #upsert

ただし、次のエラーが発生します。

ValueError:更新は$演算子でのみ機能します

"services"キーに基づいて"hostname"チャンク全体のこの更新を実行する方法はありますか(そして、hostnameが存在しない場合、最終的に新しいドキュメントを挿入します)? MongoDBの内容と更新/挿入しようとしている内容を比較するロジックを作成できることはわかっていますが、pymongoにすでに何かがあるか、これに使用できるものがあるかと期待していました。

7
MrDuk

Replace_oneを使用してドキュメントを置き換えます。

for hostname, services in dataset[0].items():
    db.titleHardware.replace_one({'hostname':hostname},
                                 {'hostname':hostname,
                                  services.keys()[0]: services.values()[0]}, 
                                 True)

pdateOne のmongodbドキュメントをご覧になりましたか? $setなどの更新演算子を指定する必要があります。

for hostname, services in dataset[0].items():
    db.titleHardware.update_one({'hostname':hostname},
                                {'$set': {services.keys()[0]: services.values()[0]}}, 
                                upsert=True)
8
sroecker