0

db.stuffのドキュメントは次のとおりです。

{ ...,
counts : [ {name: Alice, age: 18, pay: 27}, {name : Jen, age: 23, pay: 56}, ... ] ,
  ... }

次のコードを使用して、埋め込まれたドキュメントを1つずつ更新しようとしています。埋め込まれたドキュメントを繰り返し処理し、計算を実行してから、個々のサブドキュメント内に新しいキーを設定します。

x = [3, 45, 77, 61, 98, 76, 32, ... ]

for i in db.stuff.find():
    for element in i['counts']:
        x.append(element['pay'])
        total = 1.0 - ((sorted(x).index(element['pay']) + 1) / float(len(x)))
        db.stuff.update({'id': i['id']}, {'$set':{ element['new_key'] :total}})
        x.remove(element['pay'])

ただし、これが返さ<type 'exceptions.KeyError'>れるか< class 'bson.erros.InvalidDocument' >、埋め込まれたドキュメントに新しいキーを挿入するための適切な方法がないためだと思います。代替品を探す必要がありますが、{'$set':{ element['new_key'] :total}行き詰まっています。ご協力ありがとうございました。

4

1 に答える 1

1

これを試してください(位置パラメータを使用)

db.stuff.update({'id':i['id'], 'counts.name':element['name']}, {'$set': {'counts.$.newfield':total}})

これにより、dbでid = i ['id']をクエリし、counts配列でname = element ['name']のエントリを検索し、「$」を使用して、最初に一致するサブドキュメントに新しいキーと値のペアを追加します。

于 2012-12-04T00:05:08.870 に答える