MongoDB----数据库、集合、文档的操作

221 阅读3分钟

常用基本操作

>show dbs; //查看数据库
>use mydb;//切换或者创建数据库。插入数据后,show dbs才可以显示出来;
>db.stats();//统计当前数据库的信息
>db.dropDatabase();//删除当前数据库
>//进入mongo shell 即执行db.dropDatabase()
>//默认删除test数据库,存在test情况下,没有也就无所谓了

>show collections;//查看当前数据库中所有的集合
>show tables;
>db.getCollectionNames() //获取所有集合的名字,返回数组
>//第一次插入数据时,隐式创建集合
>db.stu.insert({name:"jack"});
>//显式创建一个集合
>db.createCollection("stu");
//获取所有集合的信息
>db.getCollectionInfos();
>//statistic collection info
>db.myCollection.stats()

//指定返回哪些key的数据
>db.stu.find({},{_id:0,name:1,age:0})

创建上限集合

>db.createCollection(name,{options})

capped,为true时,则为上限集合,具有存储上限,达到上限则循环覆盖旧数据 size,集合存储容量大小,单位byte max,集合中最大文档数

//是否上限集合
db.myCollection.isCapped()
//案例,创建一个上限集合,大小3byte,插入10000条数据,查看效果
for(var i=0;i<10000;i++){
	db.lauf1.insert({name:"jack"+i})
}

集合重命名

>db.users1.renameCollection("users")
>db.collection1.drop();//删除集合collection1
>//普通集合转为上限集合,也可更改上限集合的内存大小
>db.runCommand({"convertToCapped":"lauf1",size:10})

集合插入数据

insert,若插入时key重复,则DuplicateKeyException

>db.c1.insert({...});//相当于insertOne()
>db.c2.insert([{},{},...])//相当于insertMany()

>db.c3.insert({key:value},{writeConcern:{},ordered:boolean})
//writeConcern 写入的安全机制,
//ordered,true顺序写入文档,有一个文档出错则返回
//ordered,false随机写入文档,出错则忽略,继续写入

writeConcern:参考描述

更新数据

update/save
更新单个文档,满足原子性
更新多个文档,不满足原子性
多进程更新同一文档,需阻塞

>db.users.update({query},{update},{upsert:false,multi:false,writeConcern,collation})

//upsert,boolean  查询结果为空时,是否插入当前update文档
//multi,boolearn  是否更新多个结果,文档整个替换时,不能为true

>db.stu.update({name:"jack"},{"name":"tom",age:20},{upsert:true}) //替换类型

> db.stu.update({name:"jack19"},{$set:{age:20}},{upsert:true,multi:true})//非替换类型,只更新局部,$set设置key的值(可指定各种类型的值)

> db.stu.update({name:"jack19"},{$inc:{age:1}},{upsert:true,multi:true})//增加、减少数值类型,key不存在则创建,并值默认为0,在0基础上增加、减少;若没有满足条件的文档,则不做操作

> db.stu.update({name:"jack19"},{$push:{arr:25}}) //给数组插入值,key不存在则创建

> db.stu.update({name:"jack19"},{$addToSet:{arr:25}})//给数组增加元素,若元素已经存在,则忽略

> db.stu.save({})//保存一个文档,已存在则更新,不存在则插入

upsert,没有查询到需更新的记录时,插入当前{update}文档,默认false multi,是否更新多个文档,默认false writeConcern,写入的安全机制 collation,按照不同的语言定义排序规则 如{collation:{locale:"zh"}}

>db.users.save({update});//使用该文档替换已有的同名_id文档;若集合内没有同名_id,则插入该{update}文档

删除操作

remove,deleteOne,deleteMany
delete doc.field 上限集合无法删除数据

>db.users.remove({query},{justOne:false,writeConcern}) //justOne是否只删除一条
>//永久删除数据

>db.users.remove({name:"jack"})//删除name为jack的文档

>db.users.remove({})//删除所有文档

>db.users.remove({age:{$gt:20}})//删除年龄大于20的文档

deleteOne/deleteMany

>db.users.deleteMany({})//删除所有文档

>db.users.deleteMany({age:{$lt:20}})//删除年龄小于20的多个文档

>db.users.deleteOne({age:{$gt:10}})//删除一个

查询操作

find,返回满足条件的所有文档 findOne,返回一个文档

>db.users.find().pretty()//格式化输出

>db.users.find({query},{projection})//加入查询条件,投影返回的字段

>db.users.find({name:"jack",age:{$lt:20}},{_id:0,name:1,age:1})//key,0不显示

>db.users.find().sort({age:1}) //age 升序

查询条件:

>db.users.find({name:"jack",age:23})//name is jack and age is 23

>db.users.find({age:{$lte:20}})//age<=20

>db.users.find({age:{$lt:20}})//age<20

>db.users.find({age:{$gte:20}})//age>=20

>db.users.find({age:{$gt:20}})//age>20

>db.users.find(age:{$ne:20})//age!=20

>db.users.find({age:{$gte:18,$lte:20}})

>db.users.find({$or:[{},{},{},....]})//或

>db.users.find({name:{$in:["jack","tom"]}})//名字在数组中的文档  ,$nin不在数组
>db.users.find({name:{$not:"abc"}})//名字中不包含abc的文档

>db.users.find({addr:null})//addr为null的文档或者无该字段的文档

>db.users.find({name:/regexp/ig})

//key 为数组时的查询
>db.users.find({name:"a"})//查询name数组包含“a”的文档
{ "_id" : ObjectId("611dc688623a0dbae82982c8"), "name" : [ "a", "b", "c" ], "age" : 23 }

>db.users.find({name:{$all:["a","b"]}})//既包含a,又包含b的文档

> db.users.find({name:{$size:3}})//查询name数组长度为3的文档

> db.users.find({"name.2":"b"})//数组的索引2处为b的文档,必须带有引号

>db.users.find().skip(1).limit(3)//跳过一个,然后返回三个文档

>db.users.find().sort({age:1})//以age升序排序

>db.users.find({name:{$regex:"^ab$"}})//匹配姓名中以a开头,以b结尾的文档;若name为数组,则逐个匹配数组中的每一项
>

游标

遍历数据的指针,读取数据的接口

> var cursor=db.users.find()//返回游标
> while (cursor.hasNext()){ //hasNext()打开游标
... var doc=cursor.next();//返回一个文档对象[object BSON]
... print(doc);//tojson(xxx)
... printjson(doc);//以json格式输出
... }
//输出结果
[object BSON]
{
	"_id" : ObjectId("611dc14a623a0dbae82982c5"),
	"name" : "jack",
	"age" : 29
}
[object BSON]
{ "_id" : ObjectId("611dc14a623a0dbae82982c6"), "name" : "tom", "age" : 23 }

以下三种情况,游标被销毁
1)客户端保存的游标变量不在作用域内
2)游标遍历完成/ 主动关闭cursor.close()
3)服务器端10分钟内未对游标进行操作

上一篇:MongoDB----基础
下一篇:MongoDB的聚合操作