Si vous souhaitez passer d'une liste à un hachage (objet), vous pouvez le faire de manière atomique.
À partir de la documentation
:"$inc
... incrémente le champ de la valeur numérique si le champ est présent dans l'objet, sinon définit le champ sur la valeur numérique."
{ $inc : { field : value } }
Donc, si vous pouviez refactoriser votre conteneur et votre objet :
words: [
{
'word': 'foo',
'count': 1
},
...
]
à :
words: {
'foo': 1,
'other_word: 2,
...
}
vous pouvez utiliser l'opération update
avec :
{ $inc: { 'words.foo': 1 } }
qui créerait { 'foo': 1 }
si 'foo' n'existe pas, sinon incrémenter foo.
Ex. :
$ db.bar.insert({ id: 1, words: {} });
$ db.bar.find({ id: 1 })
[
{ ..., "words" : { }, "id" : 1 }
]
$ db.bar.update({ id: 1 }, { $inc: { 'words.foo': 1 } });
$ db.bar.find({ id: 1 })
[
{ ..., "id" : 1, "words" : { "foo" : 1 } }
]
$ db.bar.update({ id: 1 }, { $inc: { 'words.foo': 1 } });
$ db.bar.find({ id: 1 })
[
{ ..., "id" : 1, "words" : { "foo" : 2 } }
]