MongoDB - 添加到集合和递增

Han*_*pan 1 mongodb

我正在尝试使用MongoDB计算单词用法.我的收藏目前看起来像这样:

{'_id':###, 'username':'Foo', words:[{'word':'foo', 'count':1}, {'word':'bar', 'count':1}]}
Run Code Online (Sandbox Code Playgroud)

当一个新帖子被提出时,我将所有新单词提取到一个数组,但是我试图想要插入单词数组并在该单词已经存在的情况下递增计数.

在上面的例子中,例如,如果用户"Foo"发布了"lorem ipsum foo",我会将"lorem"和"ipsum"添加到用户单词数组中,但会增加"foo"的计数.

这可能在一个查询中?目前我正在使用addToSet:

'$addToSet':{'words':{'$each':word_array}}
Run Code Online (Sandbox Code Playgroud)

但这似乎没有提供任何增加字数的方法.

非常感谢一些帮助:)

Rya*_*mer 9

如果您愿意从列表切换到哈希(对象),则可以原子地执行此操作.

文档:" $inc...如果字段存在于对象中,则按数字值增加字段,否则将字段设置为数字值."

{ $inc : { field : value } }
Run Code Online (Sandbox Code Playgroud)

所以,如果你可以重构你的容器和对象:

words: [
  {
    'word': 'foo',
    'count': 1
  },
  ...
]
Run Code Online (Sandbox Code Playgroud)

至:

words: {
  'foo': 1,
  'other_word: 2,
  ...
}
Run Code Online (Sandbox Code Playgroud)

您可以使用以下操作update:

{ $inc: { 'words.foo': 1 } }
Run Code Online (Sandbox Code Playgroud)

{ '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   }   }
]
Run Code Online (Sandbox Code Playgroud)