shell连接mongodb
mongodb://username:password@ip:port[/dbname]
mongo --host 127.0.0.1 --port 27017-u test-p test --mymongo
创建数据库
使用use创建数据库,格式为:
use dbname
需要注意的是mongo新建的数据库只有添加数据之后才算成功创建
查看当前使用的数据库
db; (推荐)
或
db.getName();
查看所有数据库
show dbs;
删除当前正在使用的数据库
db.dropDatabase()
删除当前正在使用的数据库
查看当前使用的数据库下所有的集合
show tables;
删除集合
语法: db.collection.drop() # collection指集合的名字
示例:
>show tables;
mymongo
>db.mymongo.drop()
true
>show tables;
> # 没有集合显示了,删除成功
创建集合
语法格式:db.createCollection(name[,capped,autoIndexId,size,max])
可选参数详解:
capped(可选):布尔类型;如果设置为true,指创建固定大小的集合,
如果设置为true,一定要设置size.达到size的最大值的时候,他会覆盖之前的文档
atuoIndexId(可选):布尔类型;
如果设置为true,则自动在_id字段创建索引.默认为false
size(可选):数值;为集合设置一个固定的最大值
max(可选):数值;指定集合中包含的文档的最大数量
mongo其实会在你添加数据的时候自动创建集合
示例:
手动创建集合:
>use test
switched to db test
>db.createCollection("mycoll")
{"ok":1}
>show tables;
mycoll
创建固定集合,空间大小为6142800KB,文档最大个数1000
db.createCollection("mycoll1", { capped : true, autoIndexId:true, size : 6142800, max : 10000 } )
自动创建集合
>db.mycoll2.insert({"name":"Nick"})
>show tables;
mycoll
mycoll1
mycoll2
查看所有集合
show tables;
或
show collections;
插入文档
插入有两种方法 insert()和save().不过save()还有更新的功能
语法: db.collection_name.insert(document)
比如存一条文档到 mycoll 集合中
>use test;
>db.mycoll.insert({"name":"Nick"})
mycoll是集合名字,如果mycoll在插入文档之前不存在,mongo会自动的创建集合并插入数据
更新文档
使用update方法或者save方法
语法:
db.collection.update(
<query>,
<update>,
{
upsert:<boolean>,
multi:<boolean>,
writeConcern:<document>
}
)
参数详解:
query: update的查询条件,类试于mysql语句的where
update:更新的对象和更新用到的操作符
upsert(可选):如果不存在query匹配到的结果,是否将更新的内容作为新纪录插入.默认false,不插入
multi(可选):默认为false,只更新匹配所有结果中的第一条结果,如果为true,意为全部更新
writeConcern(可选):抛出异常的级别
示例
>db.mycoll.insert({"name":"lzd"});
>db.mycoll.update({"name":"lzd"},{$set:{"desc":"to be nick"}});
save()方法语法:save方法是利用_id进行文档替换式的更新,update是局部的更新
db.collection_name.save()
删除文档
语法:
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
参数详解:
query 查询条件
justOne(可选): 如果设置为true或者1 则只删除匹配到的一条结果,而不是全部,默认为false,删除全部
writeConcern(可选) 抛出异常的级别
mongo查询文档语法
语法:
db.collection.find(query,projection)
db.collection.find() 指查询所有文档,类试select * from table;
参数介绍:
query(可选),使用查询操作符指定的查询条件
projection(可选):返回哪些键值对,省略该参数返回文档所有键值对.
如果想要返回的数据更易读,使用pretty()
db.collection.find().pretty()
where 的mongo语法:
等于 {<key>:<value>} db.col.find({"by":"菜鸟教程"}).pretty() where by = '菜鸟教程'
小于 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50
and条件, 一个字典里面包含多个键值对,多个键值对是and关系
db.collection.find({key1:value1, key2:value2}).pretty()
示例:
db.mycoll.find({"name":"lzd","desc":"to be Nick"}).limit(1).pretty()
or条件 ,一个列表存放多个字典,多个字典是or关系,or关系可以和and同时使用
db.collection.find([{key0:value0,key1:value1},{key2:value2}])
# key0和key1是and关系 ,key0和key1组成的条件与key2条件是or关系
查询语句的limit方法 和 skip 方法
limit(num) 指定从数据库读取num条数据
skip(num)指定从数据库跳过多少条数据开始读取
skip和limit可以结合使用
mongo查询语句的排序sort
语法:
db.collection.find().sort({KEY:1/-1})
KEY 是字段名,即根据哪个字段排序, 1 代表升序排序,-1代表降序
mongo创建索引
语法:db.collection.createIndex(keys,options)
keys为你要创建索引的字段, 1为指定按升序索引, -1按降序索引
示例:
db.mycoll.createIndex({"name":1})
还可以创建联合索引
db.mycoll.createIndex({"name":1,"desc":-1})
mongo 聚合查询 参考请点击连接
示例:
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
详解:
_id这个key是定死的不能改,$group 也不能改
num_tutorial 这个是可以改的,聚合的结果名字,可以自定义
$by_user 代表根据文档中的by_user字段分组,$类试shell语法取变量值的意思
$likes和$by_yser一样效果
下面是所有聚合的例子(图片来源菜鸟教程)
聚合查询
聚合查询的其他操作符
其他操作符$project 实例
db.collection.aggregate({
$project:{
tiltle:1,
author:1
}
})
上面的例子使返回的结果只包含_id,title,author字段(_id字段默认包含)
如果想要不包含_id字段
db.collection.aggregate({
$project:{
_id:0,
tiltle:1,
author:1
}
})
$match实例
db.collection.aggregate([
{$match:{score:{$gt:60,$lt:80}}},
{$group:{_id:"$class",avg:{$avg:"$score"}}}
])
match 获取分数大于60小于80的所有文档,然后交给group去处理,使用了管道的原理
group这里的处理是根据class分组,然后计算每个class的平均分
网友评论