在对象数组上使用Mongoose / MongoDB $ addToSetfunction

说我在Mongoose模式上有这个数组属性('articles'):

articles: [ { kind: 'bear', hashtag: 'foo' }, { kind: 'llama', hashtag: 'baz', }, { kind: 'sheep', hashtag: 'bar', } ] 

我怎么用

$ addToSet https://docs.mongodb.org/manual/reference/operator/update/addToSet/

通过检查hashtag的值来添加到这个数组中,看它是否是唯一的?

例如,如果我想将以下对象添加到上面的数组中,我希望Mongo将其“拒绝”为重复:

 { kind: 'tortoise', hashtag: 'foo' } 

因为hashtag = foo已经被使用了。

问题是,我只知道如何使用简单的整数数组$addToSet

例如,如果文章看起来像这样:

 articles: [ 1 , 5 , 4, 2] 

我会这样使用$ addToSet:

 var data = { "$addToSet": { "articles": 9 } } model.update(data); 

但我怎么能完成相同的事情与唯一字段是一个string的对象数组,在这种情况下,“hashtag”? 文件没有说清楚,似乎我已经到处搜查..

谢谢

您需要使用$ne运算符。

 var data = { 'kind': 'tortoise', 'hashtag': 'foo' }; Model.update({ { 'article.hashtag': { '$ne': 'foo' } }, { 'article': { '$addToSet': data } } ) 

只有在“article”数组中没有子文档,且hashtag的值等于“foo”时,才会更新文档。

正如@BlakesSeven在评论中提到的那样

$addToSet变得无关紧要,一旦你正在testing其中一个值的存在,所以这也可能是代码清晰度的$push 。 但是原理是正确的,因为$addToSet在整个对象上工作,而不仅仅是它的一部分。

 Model.update({ { 'article.hashtag': { '$ne': 'foo' } }, { 'article': { '$push': data } } )