我正在尝试使用 MongoDB 计算单词使用情况。我的收藏目前看起来像这样:
{'_id':###, 'username':'Foo', words:[{'word':'foo', 'count':1}, {'word':'bar', 'count':1}]}
当发布新帖子时,我将所有新单词提取到一个数组中,但我试图弄清楚是否将更新插入到单词数组中并在单词已经存在的情况下增加计数。
例如,在上面的示例中,如果用户“Foo”发布了“lorem ipsum foo”,我会将“lorem”和“ipsum”添加到用户词数组中,但会增加“foo”的计数。
这可以在一个查询中实现吗?目前我正在使用 addToSet:
'$addToSet':{'words':{'$each':word_array}}
但这似乎并没有提供任何增加字数的方法。
非常感谢一些帮助:)
最佳答案
如果您愿意从列表切换到散列(对象),您可以自动执行此操作。
来自docs : "$inc
... 如果对象中存在字段,则将字段增加数值,否则将字段设置为数值。"
{ $inc : { field : value } }
因此,如果您可以重构您的容器和对象:
words: [
{
'word': 'foo',
'count': 1
},
...
]
到:
words: {
'foo': 1,
'other_word: 2,
...
}
您可以使用 update
操作:
{ $inc: { 'words.foo': 1 } }
这将创建 { 'foo': 1 }
如果 'foo' 不存在,否则递增 foo。
例如:
$ 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 } }
]
https://stackoverflow.com/questions/7904928/