精华内容
下载资源
问答
  • 本文目的:删除MongoDB列表某项/数组某项 关键命令一: $pull、update.pull、关键命令二: $upset、update.upset、删除简单数组元素、例二. 删除文档数组元素、例三. 删除多层嵌套数组某个文档、例四. 删除数组里面...

    本文目的:删除MongoDB列表某项/数组某项

    关键命令一: $pull、update.pull

    The $pull operator removes from an existing array all instances of a value or values that match a specified condition.
    它用于删除数组所匹配的项,如果数组[1,1,2,1] 执行pull 1 后,只剩下[2]

    关键命令二: $upset、update.upset

    ($unset运算符删除特定字段。请考虑以下语法:)
    The $unset operator deletes a particular field. Consider the following syntax: copycopied
    { $unset: { <“field1”>: “”, … } }

    下面看具体例子----||
    .

    例一. 删除简单数组元素

    /* 1 */
    {
        "_id" : ObjectId("5ec8c716a0d7734e6c2f16fa"),
        "name" : "数据1",
        "datas" : [ 
            "AA", 
            "BB", 
            "CC"
        ],
    }
    /* 2 */
    {
        "_id" : ObjectId("5ec8c74ca0d7734e6c2f16fb"),
        "name" : "数据2",
        "datas" : [ 
            "AA", 
            "DD", 
            "EE"
        ],
    }
    

    在这里插入图片描述

    需求一:删除name为数据1的datas数组里面的AA

    安排!
    执行以下命令

    db.getCollection('dateList').updateMany({'name':'数据1'},{'$pull': {'datas':'AA'}})
    

    执行后结果是:数据1的datas的AA已删除

    /* 1 */
    {
        "_id" : ObjectId("5ec8c716a0d7734e6c2f16fa"),
        "name" : "数据1",
        "datas" : [ 
            "BB", 
            "CC"
        ],
    }
    
    /* 2 */
    {
        "_id" : ObjectId("5ec8c74ca0d7734e6c2f16fb"),
        "name" : "数据2",
        "datas" : [ 
            "AA", 
            "DD", 
            "EE"
        ],
    }
    

    在这里插入图片描述

    需求二:删除所有数据数组datas里面的AA

    执行以下命令

    db.getCollection('dateList').updateMany({'datas':'AA'},{'$pull': {'datas':'AA'}})
    

    执行后结果是:数组datas里面的AA都已删除

    /* 1 */
    {
        "_id" : ObjectId("5ec8c716a0d7734e6c2f16fa"),
        "name" : "数据1",
        "datas" : [ 
            "BB", 
            "CC"
        ],
    }
    
    /* 2 */
    {
        "_id" : ObjectId("5ec8c74ca0d7734e6c2f16fb"),
        "name" : "数据2",
        "datas" : [ 
            "DD", 
            "EE"
        ],
    }
    

    在这里插入图片描述

    需求三:JAVA实现

    /**
     * 实体类
     */
    public class DateList {
       private String id;
       private String name;
       private List<String> datas;
    }
    
    /**
     * 删除数组内部项,接口
     * @param data 删除项的值
     * @return
     */
    @RequestMapping(value = "delete/{data}")
    @ResponseBody
    public Object delete(@PathVariable("data") String data){
    //  Query query = new Query(Criteria.where("name").is("数据1")); //查询条件:上面需求一形式
        Query query = new Query(Criteria.where("datas").is(data));  //查询条件:上面需求二形式
        Update update = new Update();//更新设置
        update.pull("datas", data);
        mongoTemplate.updateMulti(query, update, DateList.class);
        return null;
    }
    

    .

    例二. 删除文档数组元素

    {
        "_id" : ObjectId("5ec8f2b4a0d77352bc90c929"),
        "name" : "数据1",
        "datas" : [ 
            {
                "time" : "9999",
                "counts" : NumberLong(30)
            }, 
            {
                "time" : "10000",
                "counts" : NumberLong(88)
            }
        ],
    }
    

    在这里插入图片描述

    需求一:删除time="9999"的datas项

    命令

    db.getCollection('dateList').updateMany({},{$pull:{datas:{time:"9999"}}})
    或者
    db.getCollection('dateList').updateMany({'datas.time':"9999"},{$pull:{datas:{time:"9999"}}})
    

    执行后结果:

    {
        "_id" : ObjectId("5ec8f2b4a0d77352bc90c929"),
        "name" : "数据1",
        "datas" : [ 
            {
                "time" : "10000",
                "counts" : NumberLong(88)
            }
        ],
    }
    

    在这里插入图片描述

    需求二:JAVA实现

    /**
     * 实体类
     */
    public class DateList {
       private String id;
       private String name;
       private List<TimeCount> datas;
    }
    
    public class TimeCount {
        private String time;
        private Long counts;
    }
    
    /**
     * 删除数组内部项
     * @param data
     * @return
     * @throws Exception
     */
    @RequestMapping(value = "delete/{data}")
    @ResponseBody
    public Object delete(@PathVariable("data") String data) throws Exception {
    
        Query query = new Query(Criteria.where("datas.time").is(data));
        Update update = new Update();
    
        Document doc = new Document();
        doc.put("time",data);
        update.pull("datas",doc);
    
        mongoTemplate.updateMulti(query, update, DateList.class);
        return null;
    }
    

    我们对比一下,后面这个跟前面不一样的是:
    在这里插入图片描述
    可以dubug看一下,这样操作之后的query和update的值
    在这里插入图片描述
    可以看出,这样是跟mongo的执行命令一致了,所以说不管是什么语言封装,调用驱动的时候都是用相同的命令
    .

    例三. 删除多层嵌套数组某个文档

    例二的升级版,先看看数据格式,数组 datas 里面有数组 counts ,现在删除的是counts 的数据

    {
        "_id" : ObjectId("5ecde35f3bf8aad5abfe111d"),
        "name" : "数据1",
        "datas" : [ 
            {
                "time" : "9999",
                "counts" : [ 
                    {
                        "man" : "张山",
                        "girl" : "小丽"
                    }, 
                    {
                        "man" : "李四",
                        "girl" : "小红"
                    }
                ]
            }, 
            {
                "time" : "10000",
                "counts" : [ 
                    {
                        "man" : "王五",
                        "girl" : "小花"
                    }
                ]
            }
        ]
    }
    

    在这里插入图片描述

    需求:删除张山这个文档

    先上命令

    db.dateList.updateMany({'datas.time':"9999"},{$pull:{'datas.$.counts':{'man':"张山"}}})
    

    结果:

    {
        "_id" : ObjectId("5ecde35f3bf8aad5abfe111d"),
        "name" : "数据1",
        "datas" : [ 
            {
                "time" : "9999",
                "counts" : [ 
                    {
                        "man" : "李四",
                        "girl" : "小红"
                    }
                ]
            }, 
            {
                "time" : "10000",
                "counts" : [ 
                    {
                        "man" : "王五",
                        "girl" : "小花"
                    }
                ]
            }
        ]
    }
    

    .

    例四. 删除数组里面某个集合的键值

    在这里插入图片描述

    需求一:删除datas里面time="9999"的time这个键值

    直接上命令命令

    db.dateList.updateMany({'datas.time':"9999"},{$unset:{'datas.$.time':null}})
    或
    db.dateList.updateMany({'datas.time':"9999"},{$unset:{'datas.$.time':""}})
    

    这里不用 pull 命令,改用upset

    用upset来删除指定键值,这刚好满足这个需求

    执行结果(源数据跟例二一样)

    {
        "_id" : ObjectId("5ecd0d2ba0d773837421459a"),
        "name" : "数据1",
        "datas" : [ 
            {
                "counts" : NumberLong(30)
            }, 
            {
                "time" : "10000",
                "counts" : NumberLong(88)
            }
        ],
    }
    

    在这里插入图片描述

    需求二:JAVA实现(实体类跟例二一样)

    @RequestMapping(value = "delete/{data}")
    @ResponseBody
    public Object delete(@PathVariable("data") String data) throws Exception {
        Query query = new Query(Criteria.where("datas.time").is(data));
        Update update = new Update();
        update.unset("datas.$.time");
        mongoTemplate.updateMulti(query, update, DateList.class);
        return null;
    }
    

    最后,总结

    本文从删除数组内部的项出发解决几个场景问题
    本质是删除文档内嵌数据

    不同的是pull是删除内嵌数组项,upset是删除内嵌键值

    刚好例四是删除数组里面的键值,将两者完美结合,实际上upset可以删除文档内部任意键值
    另外还有个知识点,"$" 字符

    在例四中,"$" 字符 代表 下标位置索引, 满足条件的数据下标位置就会传递给 这个 字符。使用的场景就是当操作的对象是数组里面某个符合的项,然后对这些项进行内部操作。
    比如

    db.dateList.updateMany({'datas.time':"9999"},{$unset:{'datas.$.time':""}})
    

    就是操作 datas数组里面符合条件的项,如下图
    在这里插入图片描述
    正常情况下,需要这样去改变

    $unset:{'datas.0.time':""}
    

    也就是说要指定下标,但是当使用场景下标不明确的时候,就需要用$去占位。

    完结。

    感谢
    https://blog.csdn.net/wonder_dog/article/details/82682099

    https://docs.mongodb.com/v3.2/reference/operator/update/unset/
    https://www.cnblogs.com/yanzhi-1996/articles/11095002.html
    https://blog.csdn.net/weixin_30950237/article/details/99468786

    展开全文
  • 如果我们需要修改张三的年龄为18,直接使用 this.setData({data[0].age:18}) 就可以。 此时下标是我们已经知道的,假如说下标是个变量呢? 如果按照刚刚我们的写法是会报错的 那么应该怎么写呢? 首先需要定义一个...

    假设有这样一个数据:

    data:[
    	{ name:'张三',age:21 },
    	{ name:'李四',age:20 }
    ]
    

    如果我们需要修改张三的年龄为18,直接使用 this.setData({data[0].age:18}) 就可以。

    此时下标是我们已经知道的,假如说下标是个变量呢?

    如果按照刚刚我们的写法是会报错的
    在这里插入图片描述

    那么应该怎么写呢?

    首先需要定义一个变量,这个变量的值就是要修改的数据名,但是需要用字符串拼接的方式为其赋值。

    var age = ’ data[ ’ + index + ’ ].age ';

    然后使用this.setData修改他的值,要注意变量要使用 [ ] 包裹。

    this.setData( { [ age ] : 18 } )

    完整代码:

    change:function(e){
    	var index=e.currentTarget.dataset.index;
    	var data=this.data.data;
    	var age='data['+index+'].age';
    	this.setData({
    		[age]:18
    	})
    },
    
    展开全文
  • 但是,因为修改的是数组的某个属性,但是页面渲染的是数组,这是引用数据类型,更改其中的一个属性并不会触发变更检测。 下面上一下代码,讲解一下 具体的业务流程就是扫描条码,先确认条码是否为空,然后...

    有一个项目,做的功能是扫描条码,然后商品的数量加一。
    但是,因为修改的是数组中某一项的某个属性,但是页面渲染的是数组,这是引用数据类型,更改其中的一个属性并不会触发变更检测。
    下面上一下代码,讲解一下

    具体的业务流程就是扫描条码,先确认条码是否为空,然后判断接口里面的数据是否有扫描的条码,最后,把扫描数量加一

    // 货品条码扫描回车事件
    scanCodeHandle() {
    	var hasCode = false;	// 定义变量,确定扫描的条码订单内是否拥有
    	if (this.scanCode == '') {
    		return uni.showToast({
    			title: '条码不能为空'
    		})
    	}
    	for (var i = 0; i < this.instockList.length; i++) {
    		// 用输入的条码和接口返回的条码比较
    		if (this.scanCode == this.instockList[i].BarCode) {
    			this.instockList[i].scanNum +=1
    			hasCode = true;
    		}
    	}
    	this.instockList = this.instockList.slice()
    	if(!hasCode){
    		uni.showToast({
    			title:'无此条码'
    		})
    	}
    }
    

    这句代码this.instockList[i].scanNum +=1扫描对应的条码数量加一,没有即时渲染到视图里面,最后加上this.instockList = this.instockList.slice()这句代码才可以。
    因为页面渲染的是this.instrockList,这是引用数据类型,更改其中的一个属性并不会触发变更检测。this.instrockList.slice() 是重新生成了一个数组,这样的话就是重新生成了数组,页面也就重新渲染了。

    展开全文
  • 比如,要修改that.data.goods[0].price 的值,可以像这样, 这里是一个动态的变量 var price = 'goods['+index+'].price' this .setData({ [price]: 'changed data' }) 例: toggle: function (e...

    官方文档是这样的:

     changeItemInArray: function() {
        // you can use this way to modify a danamic data path
        this.setData({
          'array[0].text':'changed data'
        })
      },
      changeItemInObject: function(){
        this.setData({
          'object.text': 'changed data'
        });
      },

    无奈自己写的时候还是会遇到不能解决的问题,比如
    this.setData({
          'array[0].text':'changed data'
        })

    这里面的arry[o]是动态的,'array[index].text',像这样显然是不行的,在网上搜了搜,虽然不知其所以然,在这里记录下来。
    比如,要修改that.data.goods[0].price 的值,可以像这样,
    这里是一个动态的变量
    var price = 'goods['+index+'].price'
     this.setData({
          [price]:'changed data'
        })

    例:

    toggle: function (e) {
        // console.log(e)
        var index = e.target.id;
        let showConObj = 'catalog['+index+'].showCon';
        console.log(showConObj);
        this.setData({
          [showConObj]: !this.data.catalog[index].showCon
        })
      }

     

    转载于:https://www.cnblogs.com/LChenglong/p/9016875.html

    展开全文
  • changeItemInArray: function() { // you can use this way to modify a danamic data path this.setData({ 'array[0].text':'changed data' }) }, changeItemInObject: function(){ this.setData({ ...
  • (item, i) in ms" :key="i">{{item}} ... ... 上面的代码想要实现点击按钮修改数组第...这样,修改数组中单个元素值的需求就实现了   转载于:https://www.cnblogs.com/belongs-to-qinghua/p/11112613.html
  • JS里的"数组"不是数组,而是对象js里的数组和其他语言中的数组是不同的,实际它并不是数组,而是一种array-like 特性的对象。它只是把索引转化成字符串,用作其属性(键)。例如:var 这也正是为什么 typeof arr = ...
  • 创建数组通常创建数组有两种方式,分别为构造函数方式与数组字面量方式,而构造函数方式创建数组有个缺陷,当参数为一个数值的时候,会把这个数值当做数组的长度,创建这个一个长度为数值的字符串,其每个元素的值都...
  • 修改前: <div class="dynamic-left col-md-9 col-xs-12"><router-link :to="{path:'DynamicDetail',query:{hotArticle:hotLists[4]}}"> <div class="card bg-dark text-white"> <div class=...
  • JavaScript 中的数组是什么?在开始之前,你需要先了解数组的真正含义。在 JavaScript 中,数组是一个用于存储不同数据类型的变量。它将不同的元素存储在一个盒子中,供以后使用。声明一个数组:let myBox = []; // ...
  • KnockoutJS是一个JavaScript实现...本文主要实现官网没有提到的更新数组绑定中的数据时的操作,首先克隆该对象并更改后进行替换,从而达到更新的目的。这样可以避免重新绑定数组并更新整个列表。 &lt;!D...
  • 近期小程序项目中频繁改变数组中的值而且还需要及时显示,然后就是实现了一下,发现网上常用的字符串拼接的方式并不太适用于我的项目中来,所以就研究了一下方法,发现setData单项直接赋值修改不太好实现,就研究了...
  • 在做购物车的时候会遇到选中和非选中,以前的做法是拿到数据后先循环数据数组添加一个值为false的bull值, 当点击选中(非选中)执行函数时以前的做法是拿到当前的下标,然后改变数组此下标对象里对应的bull值...
  • 对数组 hours:[0,1,2,3…] 修改其中,需要先声明一个临时变量 temp_str,用作json的键,然后再用this.setData直接赋值就好。 increaseAmount: function (e) { var index = e.currentTarget.dataset.index ...
  • 1.ES5中新增的数组扩展方法//会改变原数组 push()和pop() shift() 和 unshift() sort() reverse() splice() //不会改变原数组 concat() slice() join() indexOf()和 lastIndexOf() (ES5新增) forEach() (ES5新增...
  • 微信小程序数组循环嵌套,获取下标,单独修改数组的值 JS代码: data{ list:[ { 'id': 1, 'text': 垃圾桶1, 'type': 0 }, { 'id': 2, 'text': 垃圾桶2, 'type': 1 } ], list_...
  • 在开发过程中,我们时常会遇到这样一种情况:当vue的data里边声明或者已经赋值过的对象或者数组(数组里边的值是对象)时,向对象中添加新的属性,如果更新此属性的值,是不会更新视图的。根据官方文档定义:如果在...
  • 问题:vue更新数组时触发视图更新的方法变异方法:Vue 包含一组观察...这些方法如下:push() 数组尾部添加pop() 数组尾部删除shift() 数组头部删除unshift() 数组头部添加splice() 数组万能增删sort() 数组排序rev...
  • 这个是我在改小程序项目时碰到的问题,不知道setData如何更改数组里的数据,下面是找到的方法 changeArray: function(t) { var e = this; var a = 'Array[' + b + ']'//b为需要改的所在的位置 e.setData({ [a...
  • 微信小程序动态修改数组中的的值 let arr = [{id:1},{id:2},{id:3},{id:4}] let newID = `arr[0].id` that.setData({ [newID ]: 5 }) 动态下标 let newID = `arr[`+index+`].id` that.setData({ [newID ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 111,959
精华内容 44,783
关键字:

修改数组某项