2012-12-03 4 views
0

Les documents db.stuff sont:Mise à jour d'une nouvelle clé dans un document intégré

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

J'utilise le code suivant pour essayer de mettre à jour les documents intégrés un par un. Je parcoure les documents incorporés, j'effectue des calculs et ensuite je veux définir une nouvelle clé dans chaque sous-document individuel.

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']) 

Cependant cela renvoie <type 'exceptions.KeyError'> ou < class 'bson.erros.InvalidDocument' >, je crois qu'il est parce que je n'ai pas la bonne méthode pour insérer la nouvelle clé dans le document incorporé. Je dois trouver un remplacement pour {'$set':{ element['new_key'] :total} mais je suis coincé. Merci de votre aide.

+0

Peut-être que je manque quelque chose mais que les données finales devraient alors ressembler à: {..., compte: [{name: Alice, âge: 18, salaire: 27, ** nouvelle_key: total **}, {nom: Jen ... ** nouvelle_key: total2 **}] ...}? – IamAlexAlright

+0

@IamAlexAlright oui absolument – Julia

Répondre

1

Essayez ceci (en utilisant les paramètres de position)

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

Cette interroge le db id = i [ 'id'] et le tableau compte pour une entrée avec le nom = élément [ 'nom'], puis en utilisant "$" nous ajoutons la nouvelle paire clé/val au premier sous-document correspondant

Questions connexes