当前位置: 首页 > 知识库问答 >
问题:

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

彭阳荣
2023-03-14

假设我在Mongoose模式上有这个数组属性(“articles”):

articles: [ 

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

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

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

]

我如何使用

$addToSethttps://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”),如何实现同样的功能呢?医生没有说清楚,我好像到处都找遍了。。

谢啦

共有2个答案

唐宇定
2023-03-14
// 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')
                        })
阎修杰
2023-03-14

您需要使用$ne运算符。

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

只有当“文章”数组中没有主题标签值等于“foo”的子文档时,才会更新文档。

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

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

Model.update({ 
    { 'articles.hashtag': { '$ne': 'foo' } }, 
    { '$push': {'articles':  data } }
)
 类似资料:
  • 问题内容: 说我在猫鼬模式上有这个数组属性(“文章”): 我该怎么用 $ addToSet https://docs.mongodb.org/manual/reference/operator/update/addToSet/ 通过检查主题标签的值以查看其是否唯一来添加到此数组? 例如,如果我要将以下对象添加到上述数组中,则希望Mongo将其“重复”删除: 因为hashtag = foo已经被使用

  • 我有一个收藏,存储一些产品的文档。在文档中,有一个数组来存储用户对产品的价格评估对象。 下面是一个用户对象的示例: app.js

  • 在使用Mongoose查询数组时,我很难得到我期望看到的内容。一个用户可以有许多与他/她的帐户相关联的房间。room对象存储在集合中附加到用户的数组中。只有一个集合叫做Users。 请考虑以下user和Room的两个架构: 我还应该指出,数据库是填充的,因为我可以看到RoboMongo中的数组(在创建用户帐户时创建了1个元素)。 正在填充从控制台输出到show database的示例数据(包括us

  • 我是mongoDB新手,在使用Mongoose从mongoDB中的数组中删除团队对象时遇到困难。我的用户收藏看起来像; 我的移除路线看起来像; 控制台在用户之前和之后记录日志。更新是完全相同的,我没有得到任何错误抛出。控制台的输出。日志(错误、数据)最终被删除 我不知道该怎么解释。我也尝试过不按这里的建议传入userID;https://stackoverflow.com/a/24289161/5

  • 互联网上充斥着处理数组的资源,但对象通常更适合数据,而且似乎更高效。 我想在动态字段名下存储键值对象,如下所示: 这样做似乎比保留一个包含所有语言的数组并对其进行过滤以获取给定语言的所有语言条目更有效。 我的问题是:如何使用猫鼬将键值对插入到具有动态名称的对象中?对象是否需要存在,或者如果在一个操作中不存在,我可以创建它吗? 我试过这个: 但不管我是否有一个空对象开始,都没有运气:。 奖励:我应该

  • 我是MongoDB的新手,我正在用Mongoose创建一个简单的数据库,模型如下:用户、游戏和玩家。 因此,一个用户不包含或包含多个游戏。每个游戏都有一个玩家,每个玩家都指一个用户。如下所示(为了清晰起见,我简化了模式): 因此,现在在前端,我想向后端发送一份请愿书,为用户Joe(_id:11111)和Bob(_id:22222)创建一个新游戏,因此我向/api/games发送了一篇帖子,帖子的主