在对象数组上使用Mongoose/MongoDB $ addToSet功能

Ale*_*lls 8 mongoose mongodb node.js mongodb-query

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

articles: [ 

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

 {
  kind: 'llama',
  hashtag: 'baz',
  },

 {
  kind: 'sheep',
  hashtag: 'bar',
  }

]
Run Code Online (Sandbox Code Playgroud)

我该怎么用

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

通过检查hashtag的值来添加到此数组以查看它是否唯一?

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

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

}
Run Code Online (Sandbox Code Playgroud)

因为hashtag = foo已被采用.

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

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

articles: [ 1 , 5 , 4, 2]
Run Code Online (Sandbox Code Playgroud)

我会像这样使用$ addToSet:

var data = {

    "$addToSet": {
     "articles": 9
   }

}

model.update(data);
Run Code Online (Sandbox Code Playgroud)

但是我怎么能用一个对象数组来完成同样的事情,其中​​唯一字段是一个字符串,在这种情况下是'hashtag'?文档没有说清楚,似乎我到处都搜索过..

谢谢

sty*_*ane 20

您需要使用$ne运算符.

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

仅当"article"数组中没有子标签,且hashtag的值等于"foo"时,才会更新文档.

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

$addToSet一旦你正在测试的一个值的存在变得无关紧要,所以这也可以被一个$push代码清晰.但是这个原则是正确的,因为它$addToSet适用于整个对象,而不仅仅是整个对象的一部分.

Model.update({ 
    { 'article.hashtag': { '$ne': 'foo' } }, 
    { '$push': {'article':  data } }
)
Run Code Online (Sandbox Code Playgroud)

  • 注意,一旦你测试其中一个值的存在,`$ addToSet`变得无关紧要,所以这也可能是[`$ push`](https://docs.mongodb.org/manual/reference/operator/update/push /)代码清晰度.但原则是正确的,因为`$ addToSet`适用于整个对象,而不仅仅是它的一部分. (6认同)
  • 一个疑问:$ addToSet的正确语法不是`{'$ addToSet':{'article':data}}`而不是`{'article':{'$ addToSet':data}}`? (3认同)