1月15日学习内容整理:存储库MongoDB之基本的增删改查操作
一、数据库操作
注意:show dbs时空数据库是不会显示在数据库列表中的,只要插入数据就会显示出来
#1、增 use config #如果数据库不存在,则创建数据库,否则切换到指定数据库。 #2、查 show dbs #查看所有 可以看到,我们刚创建的数据库config并不在数据库的列表中, 要显示它,我们需要向config数据库插入一些数据。 db.table1.insert({'a':1}) #3、删 use config #先切换到要删的库下 db.dropDatabase() #删除当前库
二、集合操作
#1、增 插入记录时就会自动生成表 #当第一个文档插入时,集合就会被创建 > use database1 switched to db database1 > db.table1.insert({'a':1}) #db就代表当前库,table1就代表集合名 WriteResult({ "nInserted" : 1 }) > db.table2.insert({'b':2}) WriteResult({ "nInserted" : 1 }) #2、查 > show tables table1 table2 #3、删 > db.table1.drop() true > show tables table2
三、文档操作
1、增
#创建一个user的局部变量,这是一个JavaScript对象 user={ "name":"egon", 'is_nb':true, 'hobbies':['music','read','dancing'] } db.userinfo.insert(user) user1={ "name":"asb", 'is_sb':true, 'hobbies':['music','read','dancing'] } user2={ "name":"egon", 'is_sb':'wxx', 'hobbies':['music','read','dancing'] } user3={ "name":"egon3", 'is_sb':false, 'hobbies':['music','read','dancing'] } #插入多个文档 db.userinfo.insertMany([user1,user2,user3]) #也可以直接写key=value db.userinfo.insertMany({'k1':'v1','k2':'v2'})
2、简单的查
需要注意的是find返回的是一个数组,findOne返回的是一个对象(也就是一个字典形式的文档记录)
所以我们使用find方法得到文档的时候不能直接用句点符去调用其中的key和value值
# 查找所有 db.userinfo.find() # 查找所有文档并且格式化打印,也就是把一个个的字典打印出来 db.userinfo.find().pretty() # 查找一个 db.userinfo.findOne() # 带过滤条件的查找,过滤条件也要写成key=value的格式 db.userinfo.find({"name":"alex"}) #查找名字为alex的记录
3、简单修改
(1)update的用法
update() 方法用于更新已存在的文档。语法格式如下: db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } ) 参数说明:对比update db1.t1 set name='EGON',sex='Male' where name='egon' and age=18; query : 相当于where条件,也要写成{key;value}的形式 update : update的对象和一些更新的操作符,相当于set后面的,可以写{key:value}这样的形式,也可以是字典的对象 upsert : 可选,默认为false,代表如果不存在update的记录不更新也不插入,设置为true代表插入,意思就是根据查找条件找不到的话,就会把更新的
记录作为一条新的记录插入而不会进行修改 multi : 可选,默认为false,代表只更新找到的第一条记录,设为true,代表更新找到的全部记录也就是根据过滤条件查找到的多条记录都修改 writeConcern :可选,抛出异常的级别。 更新操作是不可分割的:若两个更新同时发送,先到达服务器的先执行,然后执行另外一个,不会破坏文档。
(2)简单的更新操作:先查找到要修改的文档,也就拿到了字典,对这个字典进行修改后再用update进行替换
#1、最简单的更新就是用一个新的文档完全替换匹配的文档。这适用于大规模式迁移的情况。例如对下面的用户文档做 一个比较大的调整 > db.user.find().pretty() { "_id" : ObjectId("5a5b3a74c126b4b2cbb57e3f"), "name" : "egon", "girl_friends" : 33, "wives" : 23 } # 先找到要修改的对象 > var egon=db.user.findOne({'name':'egon'}) > egon { "_id" : ObjectId("5a5b3a74c126b4b2cbb57e3f"), "name" : "egon", "girl_friends" : 33, "wives" : 23 } # 修改,这时其实就变成了对字典的操作,这里用句点符就可以对key进行修改 > egon.ralationship={'girl_friends':33,'wives':23} { "girl_friends" : 33, "wives" : 23 } > egon.username=egon.name egon # 删掉没有用的 > delete egon.girl_friends true > delete egon.wives true > delete egon.name true # 完成更新 > db.user.update({'name':'egon'},egon) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.find() { "_id" : ObjectId("5a5b3a74c126b4b2cbb57e3f"), "ralationship" : { "girl_friends" : 33, "wives" : 23 }, "username" : "egon" }
注意一点:我们写的要修改的字典使用update进行替换时,是把新的字典直接覆盖成我们写的字典,如果有的key在我们写的字典中没有的话就被删掉了
(3)一个常见的错误:当过滤条件查找到的文档是多个时,我们使用修改过的字典时是会报错的,因为没法同时对多个主键id修改成相同的值,若我们把字典中的id值删掉,此时不会报错但是只是修改第一条,所以为了避免这种错误出现,我们的解决手段有两个,一个是重写过滤条件,直接定位到我们所想要修改的记录;另一个就是使用修改器
2、一个常见的错误 db.user.insert({'name':'egon','age':10}) db.user.insert({'name':'egon','age':20}) db.user.insert({'name':'egon','age':30}) > db.user.find() { "_id" : ObjectId("5a5b3ecac126b4b2cbb57e43"), "name" : "egon", "age" : 10 } { "_id" : ObjectId("5a5b3ecbc126b4b2cbb57e44"), "name" : "egon", "age" : 20 } { "_id" : ObjectId("5a5b3ecdc126b4b2cbb57e45"), "name" : "egon", "age" : 30 } # 找到的是第二个egon,他要过生日,于是长了一岁 > var obj=db.user.findOne({'name':'egon','age':20}) > obj.age++ # 我们的条件只定位到第二条记录这一条记录,所以更新是没问题的, > db.user.update({'name':'egon','age':20},obj) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 我们的条件定位到了多条记录,而obj对象的_id是一定的,文档中的_id是唯一的,我们无法将三条改成同一个_id,所以报错 > db.user.update({'name':'egon'},obj) #报错 # 删掉后,更新成功,但默认改的是第一条 > delete obj._id true > obj { "name" : "egon", "age" : 21 } > db.user.update({'name':'egon'},obj) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.find() { "_id" : ObjectId("5a5b40f6c126b4b2cbb57e46"), "name" : "egon", "age" : 21 } { "_id" : ObjectId("5a5b40f6c126b4b2cbb57e47"), "name" : "egon", "age" : 20 } { "_id" : ObjectId("5a5b40f6c126b4b2cbb57e48"), "name" : "egon", "age" : 30 } > # 所以针对这种情况,我们还以_id作为条件保证只定位到我们想要修改的对象,并且比起随机字符串,_id的查找速度更快 > db.user.update({'_id':ObjectId("5a5b40f6c126b4b2cbb57e47")},obj) # ps: 改多条 > db.user.update({'name':'egon'},obj,{'multi':true}) WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0, "writeError" : { "code" : 9, "errmsg" : "multi update only works with $ operators" #只能用修改器 } }) > db.user.update({'name':'egon'},{$set:obj},{'multi':true}) WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 1 })
(4)set修改器
通常文档只会有一部分需要更新。可以使用原子性的更新修改器,指定对文档中的某些字段进行更新。 更新修改器是种特殊的键,用来指定复杂的更新操作,比如修改、增加后者删除 #=======>1、"$set"修改器 > db.user.find() { "_id" : ObjectId("5a5b51a257147a04b81f2bb4"), "name" : "egon", "age" : 10 } { "_id" : ObjectId("5a5b51a257147a04b81f2bb5"), "name" : "egon", "age" : 20 } { "_id" : ObjectId("5a5b51a357147a04b81f2bb6"), "name" : "egon", "age" : 30 } #完全覆盖原文档 > db.user.update({'_id':ObjectId("5a5b51a257147a04b81f2bb4")},{'age':111}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.find() { "_id" : ObjectId("5a5b51a257147a04b81f2bb4"), "age" : 111 } { "_id" : ObjectId("5a5b51a257147a04b81f2bb5"), "name" : "egon", "age" : 20 } { "_id" : ObjectId("5a5b51a357147a04b81f2bb6"), "name" : "egon", "age" : 30 } > #$set只更新原文档的一部分 > db.user.update({'_id':ObjectId("5a5b51a257147a04b81f2bb5")},{'$set':{'age':222}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.find() { "_id" : ObjectId("5a5b51a257147a04b81f2bb4"), "age" : 111 } { "_id" : ObjectId("5a5b51a257147a04b81f2bb5"), "name" : "egon", "age" : 222 } { "_id" : ObjectId("5a5b51a357147a04b81f2bb6"), "name" : "egon", "age" : 30 } # 有则更新,无则新增 > db.user.update({'age':30},{'$set':{'addr':{'country':'China','city':'BJ'}}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.user.find() { "_id" : ObjectId("5a5b51a257147a04b81f2bb4"), "age" : 111 } { "_id" : ObjectId("5a5b51a257147a04b81f2bb5"), "name" : "egon", "age" : 222 } { "_id" : ObjectId("5a5b51a357147a04b81f2bb6"), "name" : "egon", "age" : 30, "addr" : { "country" : "China", "city" : "BJ" } } # 修改内嵌文档 db.user.update({'age':30},{'$set':{'addr.country':'CHINA'}}) # $unset 先按删除理解,指定哪个key哪个key就被删除掉 db.user.update({'age':30},{'$unset':{'addr':'什么值都行'}})