mongodb中$push和$pull的使用,向内嵌的数组中删除和添加元素

假设在集中在存在如下数据:

{
  "_id" : ObjectId("5cb6e53cb4276075a2262f5b"),
  "results" : [
  {
    "current" : 7.45,
    "origin" : 0,
    "target" : 100,
    "title" : "组织kr",
    "type" : 2,
    "director" : "c673e19320f1461d859f5c8703f7c47f",
    "indepartmental_needs" : "组织kr",
    "_id" : ObjectId("5cb7e9ba439a2716f888c14d"),
    "arr" : [
    {
      "_id" : 1,
      "kid" : 1,
      "parent_id" : null
    },
    {
      "_id" : 2,
      "kr_id" : 2,
      "parent_id" : 1
    },
    {
      "_id" : 3,
      "kr_id" : 3,
      "parent_id" : 1
    },
    {
      "_id" : 4,
      "kr_id" : 3,
      "parent_id" : 1
    },
    {
      "_id" : 5,
      "kr_id" : 1,
      "parent_id" : 1
    }
  ],
},

很明显,这个数据的结构是层层嵌套的,并且arr数组中存储了一个打平的父子相互引用的树结构,
需求1:
需要再向arr数组中添加元素:

this.model.findOneAndUpdate(
{
  ‘results._id‘:mongoose.Types.ObjectId(body.ancestors)
},
{
  $push:
  {
    "results.$.arr":
  {
    parent_id : 1,
    kr_id : 1
  }
  }
},
{
  upsert:true,
  ‘new‘:true
} ,
(err,data)=>{
  //return
}
);

$符号是mongodb中的占位符,也就是说当我们指定一个位置或匹配到一个元素之后,这个符号会自动指向平级的元素来进行操作,

push是直接向数组中进行添加,如果不想添加重复的元素,可以选择使用push是直接向数组中进行添加,如果不想添加重复的元素,可以选择使用push是直接向数组中进行添加,如果不想添加重复的元素,可以选择使用addToSet

需求2:
删除内嵌数组中的某一元素:

this.model.findOneAndUpdate(
{
  "results._id":mongoose.Types.ObjectId(ancestors_id)
},
{
$pull:
{
  "results.$.relation_kr_draft":{
  _id: {
    $in : arr
  }
  }
}
}
);

同样的,我们在这里还是使用了$占位符,在我们匹配到元素之后,占位符也自动匹配
————————————————
版权声明:本文为CSDN博主「多比熊」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42427109/article/details/89426172

原文地址:https://www.cnblogs.com/Joans/p/12208607.html

时间: 2024-08-03 23:03:12

mongodb中$push和$pull的使用,向内嵌的数组中删除和添加元素的相关文章

MongoDB,从数组中删除对象

{ _id: 5150a1199fac0e6910000002, name: 'some name, items: [{ id: 23, name: 'item name 23' },{ id: 24, name: 'item name 24' }] } 删除代码 db.mycollection.update( {'_id': ObjectId("5150a1199fac0e6910000002")}, { $pull: { "items" : { id: 23 }

Android学习之——如何将GridView内嵌在ScrollView中

最近在做一个项目,有一个需求是在ScrollView中内嵌一个GridView. 刚开始,我是以为能直接内嵌在里面: 1 <ScrollView 2 android:layout_width="match_parent" 3 android:layout_height="0dp" 4 android:layout_weight="5.5"> 5 <GridView 6 android:id="@+id/gridView

MongoDB .Net Driver(C#驱动) - 内嵌数组/嵌入文档的操作(增加、删除、修改、查询(Linq 分页))

目录 一.前言 (一) 运行环境 二.前期准备工作 (一) 创建 MongoDBContext MongoDb操作上下文类 (二)创建测试类 (三) 创建测试代码 三.内嵌数组增加元素操作 (一) Update.Set()方法 替换内嵌数组(不推荐使用) (二)Update.Push()方法 直接将元素压入内嵌数组(推荐) (三) Update.PushEach()方法 将多个元素压入内嵌数组(推荐) 四.内嵌数组删除元素操作 (一) Update.Set()方法 替换内嵌数组(不推荐使用) (

Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突

Git的纯命令操作,Install,Clone , Commit,Push,Pull,版本回退,撤销更新,分支的创建/切换/更新/提交/合并,代码冲突 这篇是接着上篇分布式版本库--Windows下Git的环境部署以及在GitHub上开源自己的项目讲的,上篇主要是说用GUI来图形化界面操作,但是一般我们程序员也不会这么干,用命令又轻松又愉悦,所以,这里我就再开了一篇来专门说一下纯命令是怎么去操作的,但是要注意哦,其实廖雪峰老师的网站就是非常赞的学习资源哦! 廖雪峰老师:http://www.li

02_创建Git仓库,克隆仓库,git add,git commit,git push,git pull,同行冲突,不同行冲突的结局方案,git mergetool的使用

1 创建Git资源库,残酷目录信息 创建git资源库的命令: git init –bare 仓库名称 (其中-bare表示的意思是空的库的意思) 进入E:\software\repository\git\itheima28,截图如下: hooks:提交一些脚本文件 info:存放一些个人信息,配置信息 objects:所有数据存放位置 refs:git指针信息,记录了修改了什么等的信息 config:核心的配置信息 description:描述信息 HEAD:存放的分支信息. 2 使用上面创建的

大数据架构:Push、Pull还是Search in Place

在Splunk峰会有个令人惊讶的共同主题,它是个和大数据架构相关的问题:“我应该使用那种方法和架构呢?push(推送).pull(拉取)还是search in place(靠近数据搜索)?” 在理论上,基于pull(pull-based)模式的系统其容错性是最好的.你只需要简单地等待结果,当预期的时间到达时,一次性导入那些完成的日志即可.虽然这可以在任何时间发生,但通常它们会是夜间批处理作业的一部分.并且如果什么地方出了错,你可以简单重新运行作业.但是,从Splunk上得到的通常观点则是和基于p

JS 原生 push对象到数组中遇到的问题

在做小程序开发时,需要将一个对象push到数组中,第一次写法是 for(var j in that.data.goods ){//遍历商品信息 获取商品id // console.log(that.data.goods[j].id) for(var h in that.data.cart.list){//遍历缓存中购物车列表,获取下标 if(j==h){ // var goods_id_list ={'id':'','num':''};//定义一个接受对象 console.log(that.da

把多个字符串里面的项写到不同的对象中,然后在push到一个数组中

otherUserNames: "甲,乙,丙,丁"otherUserIds: "10008750,10008711,10003348,10008747" otherUserAvatars:'头像地址,头像地址2,头像地址3.头像地址4' 首先数据上面是在data里面拿到的 原理首先将字符串转换成数组 if(otherUserAvatars){ let obj={}, 先定义一个对象来装n个对象 for(var i=0;i<otherUserAvatars.sp

用对象[属性]表示属性值 新数组记录字符在结果数组中是否出现

// 最简单数组去重法 function unique1(array){ var n = []; //一个新的临时数组 //遍历当前数组 for(var i = 0; i < array.length; i++){ //如果当前数组的第i已经保存进了临时数组,那么跳过, //否则把当前项push到临时数组里面 if (n.indexOf(array[i]) == -1) n.push(array[i]); } return n; } //对象算法 Array.prototype.unique3