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

Posted

技术标签:

【中文标题】在对象数组上使用 Mongoose / MongoDB $addToSet 功能【英文标题】:Using Mongoose / MongoDB $addToSet functionality on array of objects 【发布时间】:2016-02-08 03:45:45 【问题描述】:

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

但是如何使用唯一字段是字符串(在本例中为“hashtag”)的对象数组来完成相同的操作?文档没有说明这一点,似乎我到处都搜索过..

谢谢

【问题讨论】:

【参考方案1】:

您需要使用$ne 运算符。

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

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

正如评论中提到的@BlakesSeven

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

Model.update( 
     'articles.hashtag':  '$ne': 'foo'  , 
     '$push': 'articles':  data  
)

【讨论】:

如果对象包含“_id”字段怎么办?它仍然需要'$ne'运算符来检查重复性吗? @PavanVora,你可以在过滤器中'articles.hastag': '$ne': 'cats', 'articles.kind': '$ne': 'struct' 谢谢@styvane :) 感谢您的回复。【参考方案2】:
// 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')
                        )

【讨论】:

以上是关于在对象数组上使用 Mongoose / MongoDB $addToSet 功能的主要内容,如果未能解决你的问题,请参考以下文章

使用 mongoose 将 mongo 对象的字段设置为空

如何从 mongoose 的 mongo 文档中返回一个数组?

使用 Mongoose 将项目推送到对象中的数组

Mongoose 模式——对子文档使用对象而不是数组

Mongoose 模式——对子文档使用对象而不是数组

Mongo - 通过_id更新嵌套的对象数组