MongoDB入门(1)
参考文献
MongoDB自学参考
# 官方文档
https://docs.mongodb.com/manual/crud/
# 实验楼-免费课程(自带环境)
https://www.shiyanlou.com/courses/12
# 菜鸟教程
https://www.runoob.com/mongodb/mongodb-tutorial.html
基本概念
数据库
集合
集合是一组文档的组合,类似关系型数据库中的“表”。
{"company":"Chenshi keji"} {"people":"man","name":"peter"}
文档
文档是MongoDB的核心,类似关系型数据库中的“行”。
# 这就是引用式关系
{
"name": "Tom Benzamin",
"contact": "987654321",
"dob": "01-01-1991",
"address_ids": [
ObjectId("52ffc4a5d85242602e000000") #对应address文档的id字段
]
}
基本操作
创建数据库
启动服务
sudo service mongodb start
进入MongoDB
mongo
使用use进入数据库mydb
如果不存在,则自动创建
use mydb
查看当前连接的数据库
db
查看所有数据库
show dbs
使用db命令可以查看当前数据库对象或者集合
使用use命令可以连接到指定数据库
销毁数据库
db.dropDatabase()
> use local
switched to db local
# 删除数据库
> db.dropDatabase()
# 查看剩余所有的数据库
> show dbs
创建集合
db.createCollection(name, options)
- options: 是一个作为初始化的文档
> use mydb
switched to db mydb
# 无参数
> db.createCollection("user")
{'ok' : 1}
# 显示数据库内所有的集合
> show collections
user
# 带参数
> db.createCollection("shiyanlou2", { capped : 1, autoIndexId : 1, size : 6142800, max : 10000 } ) #带参数
{ "ok ": 1 }
- capped:类型为Boolean,如果为true创建一个大小固定的的集合,条目过大会自动覆盖
- autoIndexId:默认为false,如果为true会在_id上自动创建索引
- size:如果capped为true时需要指定,指定参数的最大值,单位为byte
- max:最大文档数
删除集合
db.xxx.drop()
> use mydb
switched to db mydb
> db.createCollection("users")
{'ok' : 1}
> show collections
插入文档
insert
db.xxx.insert()
如果数据库中不存在xxx集合,会自动创建
> use mydb
switched to db mydb
> db.users.insert([
{ name : "jam",
email : "jam@qq.com"
},
name : "tom",
email : "tom@qq.com"
}
])
查看集合中的数据db.xxx.find()
save
db.xxx.save()
如果数据库中不存在xxx集合,会自动创建
save() 还可以根据 _id 替换已存在的文档
db.xxx.save(_id:ObjectId(), NEW_DATA)
区别
insert() 不可以添加主键_id相同的文档
save() 添加文档时,主键相同会覆盖之前的文档
更新文档
db.xxx.update(SELECTION_CRITERIA, UPDATED_DATA)
# 语法结构
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
- SELECTION_CRITERIA:查找条件
- UPDATED_DATA:更新条件
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew。默认是false,不插入;true为插入
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新
- writeConcern :可选,抛出异常的级别。
db.shiyanlou.update({"e-mail":"test@qq.com"},{$set:{"e-mail":"group@qq.com"}},{multi:true})
- multi:默认为false,更新只对一个文档生效。true对多个文档生效
save可以整个更新数据
查询文档
db.xxx.find()
db.xxx.find().pretty()
默认pretty显示需要修改
echo "DBQuery.prototype._prettyShell = true" >> ~/.mongorc.js
AND
MongoDB中没有AND,多个条件查找表示为:
db.xxx.find({ key1: value1, key2: value2, key3: value3})
> db.post.find({"by":"shiyanlou","to": "chenshi"}).pretty()
OR
MongDB中,OR查询语句以$or作为关键词,用法为:
db.xxx.find({
$or[
{key1: value1},
{key2: value2}
]
}).pretty()
> db.post.find({
$or:[
{"by":"shiyanlou"},
{"title": "MongoDB Overview"}
]
}
).pretty()
同时使用AND和OR
> db.post.find({
"likes": {$gt:10},
$or: [
{"by": "shiyanlou"},
{"title": "MongoDB Overview"}
]
}).pretty()
- $gt 大于great than
- $lt 小于less than
- $gte 大于等于great than equal
- $lte 小于等于less than equal
条件操作符 $type
范例:
> db.shiyanlou.find({"name":{$type:2}})
limit()
读取前n条数据
> db.shiyanlou.find().limit(1)
skip()
读取时跳过指定数量的数据
> db.shiyanlou.find().limit(1).skip(1)
sort()
1表示升序,-1表示降序
> db.shiyanlou.find().sort({"time":1})
删除文档
remove()
db.xxx.remove(DELECTION_CRITERIA)
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
- justOne : (可选)默认值 false,则删除所有匹配条件的文档;设为 true 或 1,则只删除一个文档
- writeConcern :(可选)抛出异常的级别
deleteOne()
deleteMany()
MongoDB支持正则表达式
索引
db.xxx.ensureIndex({key: 1 | -1})
聚合 aggregate()
- $match,查询,类似find
- $limit,限制显示结果数量
- $skip,忽略结果数量
- $sort,排序
- $group,按照给定表达式组合结果
聚合管道
MongoDB的聚合框架以数据处理管道的概念为模型。文档进入多阶段管道,该管道将文档转换成汇总结果。例如
orders--status
--_id
--amount
result--_id
--total
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])
Map-Reduce
从MongoDB 2.4开始,某些mongo shell函数和属性在map-reduce操作中不可访问。
没有仔细学
单用途聚合操作
4.0版本更新使用新的API
db.collection.estimatedDocumentCount(maxTimeMS)
返回集合或视图中所有文档的计数。该方法包装count命令。
不采用查询过滤器,而是使用元数据返回集合的计数。
maxTimeMS,整数,可选。允许计数运行的最长时间。
db.collection.count(query, options)
db.collection.distinct()
返回一个数组