MongoDB - 添加到集合并递增

我正在尝试使用 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/

相关文章:

assembly - 如何正确结束 assembly ?

geodjango - Django-profiles,带有地理字段的用户配置文件?

php - 如何在 codeigniter form_validation 类中允许空值或数值?

spring - 通过 spring 注释进行的交易 - 只读与否?

asp.net-mvc - 在 Razor 模板引擎上打印可空类型

sql-server - 检查是否启用了复制

perl - 这个 zip 命令是如何在 perl 中使用的?

ruby-on-rails - 如何在 Ruby 中将数组的数组从字符串转换为 float ?

architecture - Java中的模块、插件和组件有什么区别?

php - php脚本可以打印回他们的文件名吗?