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

时间:2015-11-06 21:47:45

标签: node.js mongodb mongoose mongodb-query

说我在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);

但是我怎么能用一个对象数组来完成同样的事情,其中​​唯一字段是一个字符串,在这种情况下'#标签'?这些文档并不清楚,似乎我到处搜索过。

感谢

2 个答案:

答案 0 :(得分:18)

您需要使用$ne运算符。

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

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

正如评论中提到的@BlakesSeven

  

一旦您测试其中一个值的存在,$addToSet就会变得无关紧要,因此代码清晰度也可能是$push。但原则是正确的,因为$addToSet适用于整个对象,而不仅仅是其中的一部分。

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

答案 1 :(得分:0)

// add the comment's id to the commentsList : 
                        // share.comments.commentsList.addToSet(callback._id);
                        share.update(
                            { '$push': {'comments.commentsList':  mongoose.Types.ObjectId(callback._id) } }
                        , function(){
                            console.log('added comment id to the commentsList array of obectIds')
                        })