Se você estiver disposto a mudar de uma lista para hash (objeto), poderá fazer isso atomicamente.
Dos documentos :"
$inc
... incrementa o campo pelo valor do número se o campo estiver presente no objeto, caso contrário, define o campo para o valor do número." { $inc : { field : value } }
Então, se você pudesse refatorar seu container e objeto:
words: [
{
'word': 'foo',
'count': 1
},
...
]
para:
words: {
'foo': 1,
'other_word: 2,
...
}
você pode usar a operação
update
com:{ $inc: { 'words.foo': 1 } }
que criaria
{ 'foo': 1 }
se 'foo' não existir, senão incremente foo. Por exemplo.:
$ 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 } }
]