0

次のようなコレクション「testcol」を持つデータベース「testdb」があります。

{u'_id': ObjectId('50eeb8029b75941b9af614bd'), u'birth': 1}
{u'_id': ObjectId('50eeb82e9b75941bc820f22c'), u'birth': 2}
{u'_id': ObjectId('50eeb82e9b75941bc820f22d'), u'birth': 3}
{u'_id': ObjectId('50eeb82f9b75941bce96032c'), u'birth': 2}
{u'_id': ObjectId('50eeb82f9b75941bce96032d'), u'birth': 3}

コードは次のようなものです。

m_connection = MongoClient(M.HOST,M.PORT)
col = m_connection['testdb']['testcol']
#some_operation
cursor = col.find()
for doc in cursor:
        print doc

出生数が1より大きいすべてのドキュメントを更新しようとしているので、some_operationを次のように置き換えますcol.update({'birth':{'$gt':1}},{'$set':{'death':'near'}},{'multi':True})。エラーが発生します。TypeError: upsert must be an instance of bool

同様に、出生が2 0r 3であるすべてのドキュメントのうち1つだけを削除したいのですが、
some_operationを次のように置き換えます。col.remove({'birth' : {'$in' : [2,3]}},{'justOne' : 1})エラーが発生します。TypeError: Wrong type for safe, value must be a boolean

{}配列の代わりに直接ブール値を使用しようとしましたが、更新されるドキュメントは1つだけで、出生が2または3のドキュメントはすべて削除されます。

それがバージョンと関係がある場合に備えて:私はpymongo-2.4.1とPython2.7を持っています私が間違っているところの手がかりはありますか?どうもありがとう。

編集:ドキュメントには次のように書かれています:update(spec、document [、upsert = False [、manipulate = False [、safe = None [、multi = False [、check_keys = True [、** kwargs]]]]]])

つまり、「multi」= Trueを使用する場合は、その前にあるもの(upsert、manipulate、safe)の値を強制的に定義する必要がありますか?

また、removeの場合、remove([spec_or_id = None [、safe = None [、** kwargs]]])と表示されます。ここで言及されている「justOne」はどこにありますか?

4

1 に答える 1

2

(たとえば)multi=の呼び出しで使用する限り、Pythonは省略したオプションの引数にデフォルト値を適用します。この動作の詳細については、http://docs.python.org/2/tutorial/controlflow.html#keyword-argumentsをご覧ください。update()col.update({'birth':{'$gt':1}}, {'$set':{'death':'near'}}, multi=True)

についての他の質問に対してjustOne、残念ながら、PyMongoがまだサポートしているようには見えません。現在、これを行う方法は、を使用find_one()してドキュメントを取得し、それをに渡す_idことremove()です。

于 2013-01-11T19:52:48.213 に答える