当前位置: 首页 > 面试题库 >

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

邢飞白
2023-03-14
问题内容

说我在猫鼬模式上有这个数组属性(“文章”):

articles: [

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

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

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

]

我该怎么用

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

通过检查主题标签的值以查看其是否唯一来添加到此数组?

例如,如果我要将以下对象添加到上述数组中,则希望Mongo将其“重复”删除:

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

}

因为hashtag = foo已经被使用。

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

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

articles: [ 1 , 5 , 4, 2]

我会这样使用$ addToSet:

var data = {

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

}

model.update(data);

但是我如何使用唯一字段是字符串(在这种情况下为“标签”)的对象数组来完成同一件事?这些文档并不清楚,似乎我到处都在搜索。

谢谢


问题答案:

您需要使用$ne运算符。

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

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

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

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

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


 类似资料:
  • 假设我在Mongoose模式上有这个数组属性(“articles”): 我如何使用 $addToSethttps://docs.mongodb.org/manual/reference/operator/update/addToSet/ 要通过检查hashtag的值来添加到此数组,以查看它是否唯一? 例如,如果我想将以下对象添加到上述数组中,我希望Mongo将其作为副本“拒绝”: 因为hashta

  • 我有一个收藏,存储一些产品的文档。在文档中,有一个数组来存储用户对产品的价格评估对象。 下面是一个用户对象的示例: 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发送了一篇帖子,帖子的主