一、Collection聚集集合
1、创建一个聚集集合(table)
db.createCollection(name, {capped: <Boolean>, autoIndexId: <Boolean>, size: <number>, max <number>} )
- name:集合的名字
- capped:是否启用集合限制,如果开启需要制定一个限制条件,默认为不启用,这个参数没有实际意义
- size:限制集合使用空间的大小,默认为没有限制
- max:集合中最大条数限制,默认为没有限制
- autoIndexId:是否使用_id作为索引,默认为使用(true或false)
- size的优先级比max要高
db.createCollection("list",{size:20,capped:5,max:100})
常用方法介绍:
- 一般来说,我们创建集合用db.createCollection(name),如:db.createCollection("log"),创建一个名字为log的集合,没有任何的大小,数量限制,使用_id作为默认索引;
- 限制集合空间的大小:db.createCollection("log",{size:1024})或db.createCollection("log",{capped:true,size:1024}),创建一个名字为log集合,限制它的空间大小为1M,如果超过1M的大小,则会删除最早的记录;
- 限制集合的最大条数:db.createCollection("log",{max:1024}),创建一个名字为log集合,最大条数为1024条,超过1024再插入数据的话会删除最早的一条记录。这个不能使用capped:true,否则会报错;
- 即限制最大条数有限制使用空间大小:db.createCollection("log",{size:1024,max:1024})或db.createCollection("log",{capped:true,size:1024,max:1024}),限制集合最大使用空间为1M,最大条数为1024条
2、得到指定名称的聚集集合(table)
db.getCollection("account");
3、得到当前db的所有聚集集合
db.getCollectionNames();
4、显示当前db所有聚集索引的状态
db.printCollectionStats();
二、用户相关
1、添加一个用户
创建一个数据库新用户用db.createUser()方法,如果用户存在则返回一个用户重复错误。
语法:
db.createUser(user, writeConcern)
user这个文档创建关于用户的身份认证和访问信息;
writeConcern这个文档描述保证MongoDB提供写操作的成功报告。
user文档,定义了用户的以下形式:
{ user: "<name>",
pwd: "<cleartext password>",
customData: { <any information> },
roles: [
{ role: "<role>", db: "<database>" } | "<role>",
...
]
}
user文档字段介绍:
user字段,为新用户的名字;
pwd字段,用户的密码;
cusomData字段,为任意内容,例如可以为用户全名介绍;
roles字段,指定用户的角色,可以用一个空数组给新用户设定空角色;
在roles字段,可以指定内置角色和用户定义的角色。Built-In Roles(内置角色):
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 内部角色:__systemwriteConcern文档(官方说明)
w选项:允许的值分别是 1、0、大于1的值、"majority"、<tag set>;
j选项:确保mongod实例写数据到磁盘上的journal(日志),这可以确保mongd以外关闭不会丢失数据。设置true启用。
wtimeout:指定一个时间限制,以毫秒为单位。wtimeout只适用于w值大于1。
例如:在demo数据库创建用户demo,并给该用户demo数据库上readWrite.
db.createUser({
user: 'demo',
pwd: '123456',
roles: [{
role: 'readWrite',
db: 'demo'
}]
})
2、数据库认证、安全模式
db.auth(用户名, 密码);
3、显示当前所有用户
show users;
4、删除用户
db.removeUser("userName");
三、添加
db.集合名.insert()
db.list.insert({name:'Tom',sex:'man',age:20})
db.集合名.inserMany() 批量插入数据
db.list.insertMany([
{name:'Tom',sex:'man',age:20},
{name:'Jim',sex:'man',age:23},
{name:'Drive',sex:'man',age:50},
{name:'Zacl',sex:'woman',age:20},
{name:'JiJy',sex:'man',age:12},
{name:'Tis',sex:'man',age:23},
{name:'YuLi',sex:'man',age:43},
{name:'Lucy',sex:'woman',age:32},
{name:'KiLu',sex:'man',age:56},
{name:'Licy',sex:'man',age:46},
{name:'TiLi',sex:'woman',age:42},
{name:'Jim',sex:'man',age:20},
{name:'Tom',sex:'woman',age:20}
])
db.集合名.save(),插入数据
save()与insert()的区别
都是插入数据:
1.对于数据库中没有改字段,两者没有区别
2.对于数据库中有该字段,insert会报错,save会执行更新操作
若新增的数据中存在主键 ,insert() 会提示错误,而save() 则更改原来的内容为新内容。
四、查看聚集集合基本信息
1、查看帮助 db.yourColl.help();
2、查询当前集合的数据条数 db.yourColl.count();
3、查看数据空间大小 db.userInfo.dataSize();
4、得到当前聚集集合所在的db db.userInfo.getDB();
5、得到当前聚集的状态 db.userInfo.stats();
6、得到聚集集合总大小 db.userInfo.totalSize();
7、聚集集合储存空间大小 db.userInfo.storageSize();
8、Shard版本信息 db.userInfo.getShardVersion()
9、聚集集合重命名 db.userInfo.renameCollection("users"); 将userInfo重命名为users
10、删除当前聚集集合 db.userInfo.drop();
五、聚集集合查询
1、查询所有记录
db.userInfo.find(); 相当于:select* from userInfo;
默认每页显示20条记录,当显示不下的情况下,可以用it迭代命令查询下一页数据。注意:键入it命令不能带“;”
但是你可以设置每页显示数据的大小,用DBQuery.shellBatchSize= 50;这样每页就显示50条记录了。
2、查询去掉后的当前聚集集合中的某列的重复数据
db.userInfo.distinct("name");
会过滤掉name中的相同数据
相当于:select distict name from userInfo;
3、查询age = 20的记录
db.userInfo.find({"age": 20});
相当于: select * from userInfo where age = 20;
4、查询age > 20的记录
db.userInfo.find({age: {$gt: 20}});
相当于:select * from userInfo where age >20;
5、查询age < 22的记录
db.userInfo.find({age: {$lt: 22}});
相当于:select * from userInfo where age <22;
6、查询age >= 25的记录
db.userInfo.find({age: {$gte: 25}});
相当于:select * from userInfo where age >= 25;
7、查询age <= 25的记录
db.userInfo.find({age: {$lte: 25}});
8、查询age >= 23 并且 age <= 26
db.userInfo.find({age: {$gte: 23, $lte: 26}});
9、查询name中包含 To的数据
db.userInfo.find({name: /To/});
//相当于%%
select * from userInfo where name like ‘%To%’;
10、查询name中以T开头的
db.userInfo.find({name: /^T/});
select * from userInfo where name like ‘T%’;
11、查询指定列name、age数据
db.userInfo.find({}, {name: 1, age: 1});
相当于:select name, age from userInfo;
当然name也可以用true或false,当用ture的情况下河name:1效果一样,如果用false就是排除name,显示name以外的列信息。
12、查询指定列name、age数据, age > 25
db.userInfo.find({age: {$gt: 25}}, {name: 1, age: 1});
相当于:select name, age from userInfo where age >25;
13、按照年龄排序
升序:db.userInfo.find().sort({age: 1});
降序:db.userInfo.find().sort({age: -1});
14、查询name = Lucy, age > 22的数据
db.userInfo.find({name: 'Lucy', age:{$gt:22}});
相当于:select * from userInfo where name = ‘Lucy’ and age > ‘22’;
15、查询前5条数据
db.userInfo.find().limit(5);
相当于:select top 5 * from userInfo;
16、查询10条以后的数据
db.userInfo.find().skip(10);注意skip()想到与跳过多少条数据
相当于:select * from userInfo where id not in (
selecttop 10 * from userInfo
);
17、查询在5-10之间的数据
db.userInfo.find().limit(10).skip(5);
可用于分页,limit是pageSize,skip是第几页*pageSize
18、or与 查询
db.userInfo.find({$or: [{age: 20}, {age: 42}]});
相当于:select * from userInfo where age = 20 or age = 42;
19、查询第一条数据
db.userInfo.findOne();
相当于:selecttop 1 * from userInfo;
db.userInfo.find().limit(1);
20、查询某个结果集的记录条数
db.userInfo.find({age: {$gte: 25}}).count();
相当于:select count(*) from userInfo where age >= 25;
如果要返回限制之后的记录数量,要使用count(true)或者count(非0)
db.users.find().skip(10).limit(5).count(true);
21、按照某列进行排序
db.userInfo.find({sex: {$exists: true}}).count();
相当于:select count(sex) from userInfo;
六、修改、删除集合数据
db.collection.update(criteria, objNew, upsert, multi )
- criteria:update的查询条件,类似sql update查询内where后面的
- objNew:update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的。
- upsert : 如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : mongodb默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
将age=25的name值全部改为lisi
db.users.update({age: 25}, {$set: {name: 'lisi'}}, false, true);
相当于:update users set name = ‘lisi’ where age = 25;
将所有的name=lisi的age加50
db.users.update({name: 'Lisi'}, {$inc: {age: 50}}, false, true);
相当于:update users set age = age + 50 where name = ‘Lisi’;
将所有name=lisi的age加5,name更新为Tom
db.users.update({name: 'Lisi'}, {$inc: {age: 5}, $set: {name: 'Tom'}}, false, true);
相当于:update users set age = age + 5, name = ‘Tom’ where name = ‘Lisi’;
3、删除
db.users.remove({age: 75});
相当于 delete from users where age=75
4、查询修改删除
db.users.findAndModify({
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: 'a2'}, $inc: {age: 2}},
remove: true
});
db.runCommand({ findandmodify : "users",
query: {age: {$gte: 25}},
sort: {age: -1},
update: {$set: {name: 'a2'}, $inc: {age: 2}},
remove: true
});