美文网首页
MongoDB 入门系列(五)

MongoDB 入门系列(五)

作者: 郁南 | 来源:发表于2020-06-24 13:36 被阅读0次

修改器

$set

  1. 新建文件mongodb-9.js输入以下代码
var db = connect('family')
var father = {
    name: 'baba',
    age: '30',
    child: {
        name: 'erzi',
        age: 5,
        gender: 'nan'
    }
}
db.father.insert(father)

print('[SUCCESS]: The data was inserted successfully.'); 
  1. 查看并修改数据
    我想把father新增一个字段:{from:"shenzhen"},按照之前修改数据的方法,直接修改db.father.update({name:'baba'},{from:'shenzhen'})会发现除了from字段,别的全部删除了
> db.father.update({name:'baba'},{from:'shenzhen'})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.father.find()
{ "_id" : ObjectId("5ef2c848539195550ee2c302"), "from" : "shenzhen" } 

这种方法明显是错误的,如果针对这种多字段多层级的修改,就需要用到$set
因为上面已经修改过了数据,所以我们要先清除,然后重新生成
先执行db.father.drop()删除当前数据,然后重新插入mongo mongodb-9.js,最后执行update修改
更改

> db.father.update({name:'baba'},{$set:{name:'好爸爸'}})})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.father.find()                                   }})
{ "_id" : ObjectId("5ef2ce41946780bda6749db3"), "name" : "好爸爸", "age" : "30", "child
" : { "name" : "erzi", "age" : 5, "gender" : "nan" }, "from" : "shenzhen" }

新增

> db.father.find()
{ "_id" : ObjectId("5ef2ce41946780bda6749db3"), "name" : "baba", "age" : "30", "child" : { "name" : "erzi", "age" : 5, "gender" : "nan" } }
> db.father.update({name:'baba'},{$set:{from:'shenzhen'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.father.find()
{ "_id" : ObjectId("5ef2ce41946780bda6749db3"), "name" : "baba", "age" : "30", "child" : { "name" : "erzi", "age" : 5, "gender" : "nan" }, "from" : "shenzhen" }

可以发现执行update操作之后,再次查询下面的数据多了{from:'shenzhen'},是因为原来没有from字段,如果把from换成那么name,就是更改,否则是新增。如果想操作其他数据,比如想修改child的from,可以多动手试试。

muiti选项

(1)新建文件mongodb-10.js,并输入以下代码

var db = connect("multiple");
var list = [];
for (let q = 0; q < 5; q++) {
    list = list.concat({
        id: q
    });
}
db.array.insert(list);

print("[SUCCESS]: The list was inserted successfully.");

查询后得到一个数组

> db.array.find()
{ "_id" : ObjectId("5ef2f68edf862aae85c26fab"), "id" : 0 }
{ "_id" : ObjectId("5ef2f68edf862aae85c26fac"), "id" : 1 }
{ "_id" : ObjectId("5ef2f68edf862aae85c26fad"), "id" : 2 }
{ "_id" : ObjectId("5ef2f68edf862aae85c26fae"), "id" : 3 }
{ "_id" : ObjectId("5ef2f68edf862aae85c26faf"), "id" : 4 }

(2)数组插入数据

> db.array.update({id:0},{$set:{name:'array'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.array.find()
{ "_id" : ObjectId("5ef2f68edf862aae85c26fab"), "id" : 0, "name" : "array" }
{ "_id" : ObjectId("5ef2f68edf862aae85c26fac"), "id" : 1 }
{ "_id" : ObjectId("5ef2f68edf862aae85c26fad"), "id" : 2 }
{ "_id" : ObjectId("5ef2f68edf862aae85c26fae"), "id" : 3 }
{ "_id" : ObjectId("5ef2f68edf862aae85c26faf"), "id" : 4 }

可以发现只有id为0这条数据插入了新的数据,如果我们想批量插入,就可以用multi属性

> db.array.update({},{$set:{name:'array'}},{multi:true})
WriteResult({ "nMatched" : 5, "nUpserted" : 0, "nModified" : 4 })
> db.array.find()
{ "_id" : ObjectId("5ef2f68edf862aae85c26fab"), "id" : 0, "name" : "array" }
{ "_id" : ObjectId("5ef2f68edf862aae85c26fac"), "id" : 1, "name" : "array" }
{ "_id" : ObjectId("5ef2f68edf862aae85c26fad"), "id" : 2, "name" : "array" }
{ "_id" : ObjectId("5ef2f68edf862aae85c26fae"), "id" : 3, "name" : "array" }
{ "_id" : ObjectId("5ef2f68edf862aae85c26faf"), "id" : 4, "name" : "array" }

要注意的是,既然是批量插入数据,第一个参数就不需要具体匹配,所以是空对象

$unset

移除数据

  1. 新建mongodb-11.js,并输入以下代码
var db = connect('time')
var list = [
    {
        id: 0,
        name: 'id1',
        timeStamp: new Date().getTime()
    },
    {
        id: 1,
        name: 'id2',
        timeStamp: new Date().getTime()
    }
]

db.stamp.insert(list)

print('[SUCCESS]: The list was inserted successfully.'); 
  1. 执行文件并查询数据是否插入数据库
> show dbs
admin        0.000GB
charles      0.000GB
company      0.000GB
family       0.000GB
local        0.000GB
log          0.000GB
log2         0.000GB
performance  0.004GB
time         0.000GB
ver          0.000GB
version2     0.000GB
> use time
switched to db time
> show collections
stamp
> db.stamp.find()
{ "_id" : ObjectId("5ef2f1b7904c1af28418eb9a"), "id" : 0, "name" : "id1", "timeStamp" : 1592979895983 }
{ "_id" : ObjectId("5ef2f1b7904c1af28418eb9b"), "id" : 1, "name" : "id2", "timeStamp" : 1592979895983 }
  1. 删除
    通过update的不同关键字删除
> db.stamp.find()
{ "_id" : ObjectId("5ef2f1b7904c1af28418eb9a"), "id" : 0, "name" : "id1", "timeStamp" : 1592979895983 }
{ "_id" : ObjectId("5ef2f1b7904c1af28418eb9b"), "id" : 1, "name" : "id2", "timeStamp" : 1592979895983 }
> db.stamp.update({id:1},{$unset:{name:''}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.stamp.find()
{ "_id" : ObjectId("5ef2f1b7904c1af28418eb9a"), "id" : 0, "name" : "id1", "timeStamp" : 1592979895983 }
{ "_id" : ObjectId("5ef2f1b7904c1af28418eb9b"), "id" : 1, "timeStamp" : 1592979895983 }

对比上下的数据,可以发现数组的第二项的name字段已经被删除。所以想要想删除某一项数据,通过$unset把对应的字段值置为任意值就行了

$inc对数字进行计算

它是对value值的修改,但是修改的必须是数字,字符串是不起效果的。我们现在要对MiJie的年龄减去2岁,就可以直接用$inc来操作。

db.workmate.update({"name":"child"},{$inc:{"age":-2}})

upsert选项

upsert是在找不到值的情况下,直接插入这条数据。这时候可以使用upsert选项直接添加。

db.father.update({name:'xiaoWang'},{$set:{age:20}},{upsert:true})

upsert有两个值:true代表没有就添加,false代表没有不添加(默认值)。

$push

看到push关键字很容易联想到数组,下面来验证一下

  1. 新建文件mongodb-12.js,输入以下代码
var db = connect('operate')
var obj = {
    name: 'operate'
}

db.ops.insert(obj)

print('[SUCCESS]: The obj was inserted successfully.'); 
  1. 查询并使用$push验证
> db.ops.find()
{ "_id" : ObjectId("5ef2faa7a543ac458cbff920"), "name" : "operate" }
> db.ops.update({name:'operate'},{$push:{index:'1'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.ops.find()
{ "_id" : ObjectId("5ef2faa7a543ac458cbff920"), "name" : "operate", "index" : [ "1" ] }

从上面可以看出,多了 index 字段,并且值是一个数组。如果我想一次性插入一个数组怎么做呢?

连续使用js文件初始化数据,差点忘了命令也可以执行js代码,下面就用js代码插入数组。
插入之前为了数据纯净我们先 drop 清空,然后重新插入数据再做操作

> db.ops.find()
{ "_id" : ObjectId("5ef2fc7abaebc191f3e940df"), "name" : "operate" }
> var arr1 = [1,2,3,4,5,6]
> db.ops.update({name:'operate'},{$push:{index:arr1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.ops.find()
{ "_id" : ObjectId("5ef2fc7abaebc191f3e940df"), "name" : "operate", "index" : [ [ 1, 2, 3, 4, 5, 6 ] ] }

可以看到生成一个二维数组,从上面得出结论,只要是使用$push方法,对应操作的字段就默认生成一个数组,并在数组内插入push对应的字段值,同理得出,如果操作的字段是对象,会操作失败。

其他

$ne查找是否存在

它主要的作用是,检查一个值是否存在,如果不存在再执行操作,存在就不执行,这个很容易弄反,记得我刚学的时候就经常弄反这个修改器的作用,给自己增加了很多坑。
例子:如果xiaoWang的爱好(interest)里没有palyGame这个值,我们就加入Game这个爱好。

db.workmate.update({name:'xiaoWang',"interest":{$ne:'playGame'}},{$push:{interest:'Game'}})

总结:没有则修改,有则不修改。

$addToSet升级版的$ne

它是$ne的升级版本(查找是否存在,不存在就push上去),操作起来更直观和方便,所以再工作中这个要比$en用的多。
例子:我们现在要查看小王(xiaoWang)兴趣(interest)中有没有阅读(readBook)这项,没有则加入读书(readBook)的兴趣.

db.workmate.update({name:"xiaoWang"},{$addToSet:{interest:"readBook"}})

$each 批量追加

它可以传入一个数组,一次增加多个值进去,相当于批量操作,性能同样比循环操作要好很多,这个是需要我们注意的,工作中也要先组合成数组,然后用批量的形式进行操作。
例子:我们现在要给xiaoWang,一次加入三个爱好,唱歌(Sing),跳舞(Dance),编码(Code)。

var newInterset=["Sing","Dance","Code"];
db.workmate.update({name:"xiaoWang"},{$addToSet:{interest:{$each:newInterset}}})

$pop 删除数组值

$pop只删除一次,并不是删除所有数组中的值。而且它有两个选项,一个是1和-1。
1:从数组末端进行删除
-1:从数组开端进行删除
例子:现在要删除xiaoWang的编码爱好(code)。

db.workmate.update({name:'xiaoWang'},{$pop:{interest:1}})

数组定位修改
有时候只知道修改数组的第几位,但并不知道是什么,这时候我们可以使用interest.int 的形式。
例子,比如我们现在要修改xiaoWang的第三个兴趣为编码(Code),注意这里的计数是从0开始的。

db.workmate.update({name:'xiaoWang'},{$set:{"interest.2":"Code"}})

相关文章

  • MongoDB 入门系列(五)

    修改器 $set 新建文件mongodb-9.js输入以下代码 查看并修改数据我想把father新增一个字段:{f...

  • MonogoDB入门教程01

    注:本系列教程是自己学习的记录,内容来至 菜鸟教程MongoDB入门教程01MongoDB入门教程02MongoD...

  • MongoDB入门教程03

    注:本系列教程是自己学习的记录,内容来至 菜鸟教程MongoDB入门教程01MongoDB入门教程02MongoD...

  • MongoDB入门教程02

    注:本系列教程是自己学习的记录,内容来至 菜鸟教程MongoDB入门教程01MongoDB入门教程02MongoD...

  • MongoDB入门教程04

    注:本系列教程是自己学习的记录,内容来至 菜鸟教程MongoDB入门教程01MongoDB入门教程02MongoD...

  • MongoDB入门教程05

    注:本系列教程是自己学习的记录,内容来至 菜鸟教程MongoDB入门教程01MongoDB入门教程02MongoD...

  • SpringBoot入门建站全系列(二十六)Mongodb非关系

    SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用 一、概述 MongoDB 是一个基...

  • 《开发者头条》每日精选(8-4)

    系列文章:MongoDB 从入门到精通 codefrom.com by 狗狗侠 from booooom 大数据全...

  • MongoDB教程(初识篇)

    目录一、定义二、安装 系列教程MongoDB教程(入门篇) 一、定义 1、MongoDB是什么 一个基于分布式文件...

  • MongoDB 新手入门 - Aggregation

    本文是 MongoDB 新手入门 系列的第二篇,在本文中,我们将会讲解 MongoDB 的聚合框架,在看完本文后,...

网友评论

      本文标题:MongoDB 入门系列(五)

      本文链接:https://www.haomeiwen.com/subject/pekrfktx.html