2013-07-14 3 views
1

Supposons que le schéma suivant:MongoDB: Upserting et documents sous

{ 
    '_id' : 'star_wars', 
    'count' : 1234, 
    'spellings' : [ 
    { spelling: 'Star wars', total: 10}, 
    { spelling: 'Star Wars', total : 15}, 
    { spelling: 'sTaR WaRs', total : 5} ] 
} 

Je peux mettre à jour le compte et l'une des orthographes en faisant ceci:

db.movies.update( 
    {_id: "star_wars", 
    'spellings.spelling' : "Star Wars" }, 
    { $inc : 
     { 'spellings.$.total' : 1, 
     'count' : 1 }} 
) 

Mais cette forme de mise à jour n » t travailler avec upsert. c'est-à-dire, si j'essaie de mettre à jour (avec upsert) avec un _id qui n'existe pas, ou avec une orthographe qui n'existe pas déjà, rien ne se passe.

Existe-t-il une solution qui me permet d'augmenter lors de la mise à jour ($ inc) d'un sous-document?

Merci!

+0

Afficher la requête avec la 'upsert' qui ne fonctionne pas si nous pouvons vous aider. Si vous utilisez la requête ci-dessus avec l'option 'upsert', il n'y a pas de' nouvelle orthographe 'définie, donc finalement il n'en ajoutera pas. Il va juste mettre à jour les orthographes existantes – Schaliasos

+0

J'ai essayé la requête ci-dessus, avec l'option upsert. Y a-t-il un autre moyen de l'écrire? Je veux fondamentalement mettre à jour 'count', et 'total' pour une orthographe spécifique (avec +1 chacun), mais avec upsert (c'est-à-dire qu'un document entier sera créé si _id ne correspond pas, ou un sous-document sera créé si _id est apparié mais l'orthographe spécifique n'est pas présente). –

+0

duplication possible de [Upsert Array Elements correspondant aux critères dans un document MongoDB?] (Http://stackoverflow.com/questions/8871363/upsert-array-elements-matching-criteria-in-a-mongodb-document) – WiredPrairie

Répondre

2

Cependant, vous pouvez modifier un peu votre schéma. Si vos documents ressemblaient à ceci:

{ 
    '_id' : 'star_wars', 
    'count' : 1234, 
    'spellings' : 
    { 
     'Star wars': 10, 
     'Star Wars': 15, 
     'sTaR WaRs': 5 
    } 
} 

Vos mises à jour deviendraient aussi simple que:

db.movies.update({_id:"star_wars"},{$inc:{"spellings.Star Wars":1}},true) 
+0

Stefan, c'est là que j'ai commencé à l'origine, mais ensuite j'ai ce problème à la place: http://stackoverflow.com/questions/17639651/mongodb-aggregation-framework :) –

+0

Je vois. Je ne pense pas qu'il existe une solution qui permettrait de résoudre vos deux problèmes :( –

Questions connexes