MongoDB 学习4 文档 新增,修改,删除
插入文档
单个插入
这里我都在可视化工具 robo 3T下操作了
user1 = { "name":"李四", "age":"21", "gender":"男" } db.userInfo.insert(user1)
这里我定义一个user1,json格式的数据,调用insert命令,成功插入,这个命令也可以插入多条。
需要注意的是,原来userInfo这个集合中没有gender字段,随着这个数据的插入,会新增,不会报错,如果是关系型数据库,肯定报错。
user1 = { "name":"李四", "age":"21", "gender":"男", "info":{ "country":"中国", "province":"四川", "city":"成都" } } db.userInfo.insertOne(user1)
还有insertOne,插入一条数据。
插入数据时,会自动给一个索引列,_id,这是固定的,然后随机生成唯一的值,如果想指定这个值,只需要在user1中声明_id就行了,注意不要重复。
另外我这里声明user1这种json格式的数据,只是为了直观,直接把json写在insert里也可以,但是看着费劲些。
一个特殊的方法save,指定_id的情况下,如果已存在,是修改,不存在是新增,不指定_id,是新增。
user1 = { "_id":"1", "name":"王五", "age":"16", "gender":"女", "info":{ "country":"中国", "province":"北京", "city":"北京" } } db.userInfo.save(user1)
第一次执行顺利新增,修改一下age,再次执行,变成更新。
批量插入
很简单,json改成数组就行了
user1 = { "_id":"2", "name":"露西", "age":"11", "gender":"女", "info":{ "country":"中国", "province":"北京", "city":"北京" } } user2 = { "_id":"3", "name":"李雷", "age":"18", "gender":"男", "info":{ "country":"中国", "province":"香港", "city":"香港" } } db.userInfo.save([user1,user2])
这里定义2个json,调用save方法,插入数组,执行成功。
另外还有insert,insertMany,都一样,插入数组就行。
需要注意的就是save,insert,insertMany 批量插入时参数用[ ]括起来。
更新
save可以更新,这里不再细说。
update 用于更新已存在的文档,它的参数如下
db.userInfo.update(query,update,options)
query:要更新数据的查询条件,相当于sql中的where
update:要更新的对象
upsert:可选,如果query后不存在该对象,是否变成新增操作,默认false,不新增
multi:可选,如果query出多条数据,是否全部更新,默认false,只更新第一条
user1 = { "name":"莉莉", "age":"13", "gender":"女", "info":{ "country":"中国", "province":"北京" } } db.userInfo.update({"name":"露西"},user1)
db.userInfo.update({"name":"露西"},user1,false,true) 这样就是不新增,可批量修改。
但是update有一个问题就是,会移除忽略的键,例如这个 露西,之前在info中有3个键,我更新的时候把city键去掉了,这样新的 莉莉 文档中,就没有 city这一项,它其实就是一个,全文档的更新操作,而不是只更新我指定的哪些键。
如果要保留忽略的键,需要使用 $set操作符。
以updateOne为例
user1 = { $set:{ "age":"15" } } db.userInfo.updateOne({"name":"王五"},user1)
表示只修改王五的age
但是需要注意的是
user1 = { $set:{ "age":"20", "info":{ "country":"美国" } } } db.userInfo.updateOne({"name":"王五"},user1)
info里原本有3个项,这么改完后,只有一个项了,因为$set关注的可能是 info 这个级别,而不是下面的级别,千万要注意。
user1 = { $set:{ "age":"20", "nickName":"小五", "info":{ "country":"美国", "city":"纽约" } } } db.userInfo.updateOne({"name":"王五"},user1)
这个nickName和info里的city,原来是没有的,通过修改,又可以新增这两个项。
还有一个批量更新
updateMany,用法是一样的
删除
remove
db.userInfo.remove({"name":"李四"},{justOne:true})
justOne是true表示删除一条name是李四的文档,等同于db.userInfo.deleteOne({"name":"李四"});
如果justOne是false,就是删除所有李四,等同于db.userInfo.deleteMany({"name":"李四"});
删除全部,不推荐用吧
db.userInfo.deleteMany({}) = db.userInfo.remove({})