mongoDB基础

一、数据库操作

1、创建数据库
如果想创建一个数据库名称为:
use mydb #use会创建一个新的数据库,如果该数据库存在,则切换到这个数据库

2、检查当前的数据库
db
返回mydb

3、查询数据库列表
show dbs #创建的数据库(mydb)不存在于列表中
如果想要显示刚创建的数据库,需要至少插入一个文档进去
db.movie.insert({“name”:”yiibai tutorials”})
show dbs

4、删除数据库
db.dropDatabase() #D大写,用于删除当前的数据库

二、集合操作

1、创建集合
db.createCollection(name,options)
db.createCollection(‘mycollection’) #创建集合时可指定选项,选项是可选的
选项列表:
1)capped:Boolean类型,如果为true,它启用上限集合。上限集合是一个固定大小的集合,当它达到其最大尺寸会自动覆盖最小的条目。如果指定true,还需要指定参数的大小
2)autoIndexID:Boolean类型,如果为true,自动创建索引_id字段。默认值为False
3)size:number类型,指定的上限集合字节的最大尺寸。如果capped为true,那么还需要指定这个字段
4)max:number类型,指定上限集合允许的最大文件数

db.createCollection(‘mycol’,{capped:true,autoIndexID:true,size:6142800,max:10000});#autoIndexID严格按照大小写,不然会报错
备注:
在mongoDB中并不需要创建集合。当插入一些文档mongoDB会自动创建集合
db.yiibai.insert({“name”:”yiibai”});#会创建一个名称为yiibai的集合

2、查看当前集合
show collections;

3、删除集合
db.mycollection.drop(); #mycollection是集合名

三、文档操作
1、插入文档
db.mycol.insert({
_id: ObjectId(7df78ad8902c), #如果我们不指定_id参数插入的文档,那么 MongoDB 将为文档分配一个唯一的ObjectId
title: ‘MongoDB Overview’,
description: ‘MongoDB is no sql database’,
by: ‘yiibai tutorials’,
url: ‘http://www.yiibai.com',
tags: [‘mongodb’, ‘database’, ‘NoSQL’],
likes: 100
})
备注:
插入多个文档,可以通过insert()命令的数组方式(也就是通过中括号定义一个数组)
其他插入文档的方法:
db.collection.insertOne():将单个文档插入到集合中
db.collection.insertMany():将多个文档插入到集合中
db.collection.save()

2、查询文档
db.collection_name.find() #find()方法将以非结构化的方式显示所有的文件
如果显示结果是格式化的,那么可以用pretty()方法:
db.mycol.find().pretty()
除了find()方法还有findOne()方法,仅返回一个文档:
db.mycol.findOne().pretty()

1)投影:
当执行find()方法时,默认会显示一个文档的所有字段。投影的意思就是只选择必要的字段显示。
要做到这一点,需要设置字段的值为0或1。1用来显示字段而0用来隐藏字段。
语法格式:
db.collection_name.find({},{key:1})
db.mycol.find({“title”:”MongoDB Overview”},{“_id”:1,”title”:1}) #显示匹配title是MongoDB Overview的行,并且显示_id和title两个字段

投影概念参考链接:
https://www.cnblogs.com/wangjing666/p/6837157.html

2)限制记录数:
limit()
db.mycol.find({},{‘_id’:1,’title’:1}).limit(2);#只显示两个记录
3)跳过记录:
skip()
db.mycol.find({},{‘_id’:1,’title’:1}).limit(1).skip(2);#跳过前2个,只显示一个记录(显示第三个记录)

limit和skip详细介绍:
http://www.runoob.com/mongodb/mongodb-limit-skip.html

4)排序:
db.mycol.find({},{“title”:1,”_id”:0}).sort({“title”:-1});#按title降序排序
db.mycol.find({},{“title”:1,”_id”:1}).sort({“_id”:1});#按”_id”升序排序
备注:
1用于升序,而-1用于降序

排序参考链接:
http://www.runoob.com/mongodb/mongodb-sort.html

5)mongoDB的where:
等于:
db.mycol.find({“by”:”yiibai tutorials”}).pretty()
等效于:where by = ‘yiibai tutorials’
小于:
db.mycol.find({“likes”:{$lt:50}}).pretty()
等效于:where likes < 50
小于等于:
db.mycol.find({“likes”:{$lte:50}}).pretty()
等效于:where likes <= 50
大于:
db.mycol.find({“likes”:{$gt:50}}).pretty
等效于:where likes > 50
大于等于:
db.mycol.find({“likes”:{$gte:50}}).pretty()
等效于:where likes >= 50
不等于:
db.mycol.find({“likes”:{$ne:50}).pretty()
等效于:where likes != 50

6)mongoDB的and操作符
$and
db.mycol.find({$and:[{“by”:”yiibai tutorials”},{“likes”:100}]}).pretty()
等效于:where by=”yiibai tutorials” and likes=100
也可以通过使用’,’来传递多个键,mongoDB也将其视为and条件:
db.mycol.find({“by”:”yiibai tutorials”,”likes”:100}).pretty();

7)mongoDB的or操作符
$or
db.mycol.find({$or:[{“by”:”yiibai tutorials”},{“likes”:100}]}).pretty()
等效于:where by=”yiibai tutorials” or likes=100

8)查询嵌套文档(使用点符号)
db.inventory.insertMany( [
{ item: “journal”, qty: 25, size: { h: 14, w: 21, uom: “cm” }, status: “A” },
{ item: “notebook”, qty: 50, size: { h: 8.5, w: 11, uom: “in” }, status: “A” },
{ item: “paper”, qty: 100, size: { h: 8.5, w: 11, uom: “in” }, status: “D” },
{ item: “planner”, qty: 75, size: { h: 22.85, w: 30, uom: “cm” }, status: “D” },
{ item: “postcard”, qty: 45, size: { h: 10, w: 15.25, uom: “cm” }, status: “A” }
]);
查询选择字段size等于{ h: 14, w: 21, uom: “cm” }的所有文档:
db.inventory.find( { size: { h: 14, w: 21, uom: “cm” } } )
备注:
嵌入式文档中的相等匹配需要精确匹配指定的文档,包括字段顺序(顺序不对不匹配)

查询嵌套字段:使用点符号
db.inventory.find({“size.uom”:”in”});

9)更新文档
update
db.mycol.update({“_id”:100},{$set:{“title”:”update the MongoDB Overview”}}); #将”_id”为100的那一行的title更新为update the MongoDB Overview
备注:
默认情况下,mongoDB只会更新一个文档。要更新多个文档,需要将参数”multi”设置为true
db.mycol.update({“title”:”MongoDB Overview”},{$set:{“title”:”New Update MongoDB Overview”}},{multi:true})

save
db.mycol.save({“_id”:100,”title”:”New MongoDB Overview”}) #语法跟insert类似,将_id值为100的title设置为’New MongoDB Overview’

10)删除文档
db.mycol.remove({‘_id’:103});#删除_id为103的文档
如果有多条记录,并且只想删除第一条记录,则在remove()方法中设置justOne参数:justOne的值设置为true或1,则只删除一个文档
db.mycol.remove({‘_id’:101},1);
如果不指定删除条件,MongoDB 将删除集合中的所有文档,相当于sql中的truncate:
db.mycol.remove()

四、索引操作
索引可以有效的提高查询效率。没有索引,mongoDB必须扫描集合的每个文档,以选择与查询语句匹配的文档。这种扫描效率很低,需要mongoDB处理大量的数据。
索引是特殊的数据结构,以易于遍历的形式存储数据集的一小部分。索引存储特定字段或一组字段的值,按照索引中指定的字段值排序。

1)创建索引
db.mycol.ensureIndex({“title”:1});#1是升序。要按降序创建索引,需要使用-1
可以在多个字段上创建索引:
db.mycol.ensureIndex({“title”:1,”description”:-1})

ensureIndex()可接受的参数:
background:Boolean类型,在后台构建索引,以便构建索引不会阻止其他数据库活动,则指定background的值为true。默认值为false
unique:Boolean类型,创建一个唯一的索引
name:String类型,索引的名称。如果未指定,则MongoDB通过连接索引字段的名称和排序顺序来生成索引名称。

2)查看索引
db.mycol.getIndexes()

3)查看索引大小
db.mycol.getIndexSize()

4)删除所有索引
db.mycol.dropIndexes()

5)删除指定索引
db.mycol.dropIndex(“索引名称”)

五、聚合操作
聚合操作处理数据记录并返回计算结果。聚合操作将多个文档中的值组合在一起,并可对分组数据执行各种操作,以返回单个结果。
在SQL中的 count(*)与group by组合相当于mongodb 中的聚合功能。

集合中插入如下数据:
db.article.insert([{_id:100,title:’MongoDB Overview’,description:’MongoDB is no sql atabase’,by_user:’Maxsu’,url:’http://www.yiibai.com',tags: [‘mongodb’, ‘database’, ‘NoSQL’],likes: 100},
{_id:101,title:’NoSQL Overview’,description:’No sql database is very fast’,by_user:’Maxsu’,url:’http://www.yiibai.com',tags:['mongodb', ‘database’, ‘NoSQL’],likes: 10},
{_id:102,title:’Neo4j Overview’,description:’Neo4j is no sql database’,by_user:’Kuber’,url:’http://www.neo4j.com',tags:['neo4j', ‘database’, ‘NoSQL’],likes: 750},
{_id:103,title:’MySQL Overview’,description:’MySQL is sql database’,by_user:’Curry’,url:’http://www.yiibai.com/mysql/',tags:['MySQL', ‘database’, ‘SQL’],likes: 350}
])

查询每个用户写入多少个教程:#_id代表你想聚合的数据的主键
db.article.aggregate([{$group:{_id:”$by_user”,num_tutrial:{$sum:1}}}])
等效于:
select by_user, count(*) as num_tutorial from ‘article’ group by by_user;

其他聚合函数(除了$sum以外):
1)$avg:求给定值的平均值
db.article.aggregate([{$group:{_id:”$by_user”,num_total:{$avg:”$likes”}}}])
2)$min:求给定值的最小值
db.article.aggregate([{$group:{_id:”$by_user”,num_min:{$min:”$likes”}}}])
3)$max:求给定值的最大值
db.article.aggregate([{$group:{_id:”$by_user”,num_max:{$max:”$likes”}}}])
4)$push:将值插入到生成的文档的数组中
db.article.aggregate([{$group:{_id:”$by_user”,url:{$push:”$url”}}}])
5)$addToSet:将值插入生成的文档中的数组,但不会创建重复项
db.article.aggregate([{$group:{_id:”$by_user”,url:{$addToSet:”$url”}}}]);
6)$first:从源文档获取第一个文档
db.article.aggregate([{$group:{_id:”$by_user”,first_url:{$first:”$url”}}}]);
7)$last:从源文档获取最后一个文档
db.article.aggregate([{$group:{_id:”$by_user”,last_url:{$last:”$url”}}}]);

除了group之外,聚合框架中其他的几个操作:
1)$project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
db.article.aggregate({$project:{title:1,by_user:1}});#显示title和by_user字段,默认_id也会显示,如果不想显示_id,设置_id:0即可
2)$match:用于过滤数据,只输出符合条件的文档
db.articles.aggregate([{$match :{score:{$gt:70,$lte:90}}},{$group:{_id:null,count:{$sum:1}}}]);

#$match用于获取分数大于70小于或等于90记录,然后将符合条件的记录送到下一阶段$group管道操作符进行处理。
3)$skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
db.article.aggregate({ $skip : 5 });#经过$skip管道操作符处理后,前五个文档被”过滤”掉。
4)$limit:用来限制MongoDB聚合管道返回的文档数。
5)$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
6)$sort:将输入文档排序后输出。