版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/damage_e/article/details/78722423
文档 组成 集合;集合 组成 数据库。
文档 如同python中dict.
数据库操作是使用JavaScript shell进行操作
数据库操作
- 查看所有数据库
show dbs
- use 切换数据操作,也是创建数据库命令
use test
- 数据库删除
db.dropDatabase()
- 查看集合
show collections
显示所有数据库中的集合,或者show tables - insert 数据创建
post = {"title":"My Blog Post","content":"Here's my blog post.","date":new Date()}
db.blog.insert(post)
- 批量插入
batchInsert([{name:Jack,sex:male},{name:Bob,age:25},{name:Rose,age:23},{name:Dan,age:36}])
- save(),是一个shell函数,如果如果有相同_id的,直接进行替代操作,而insert则会报错。
- 批量插入
find()/findOne() 数据读取
db.blog.find()
db.test_collection.find().count() //查看数据条数
db.test_collection.find().skip(3).limit(2).sort({x:1})//跳过前三条,限制条数为2,并以x排序
高级功能:
1.只返回需要的键值:
db.users.find({},{"username" : 1,"email" : 1})
但“_id”默认都要返回,此时用:
db.users.find({},{"username" : 1,"_id" : 0})
2.查询条件:$lt,$lte,$gt,$gte
对应<,<=,>,>=
可用于数和日期。
db.users.find({"age":{"$lt":30,"$gt":20}})
3.元操作符$and,$or,$nor
db.users.find({"$and":[{"x":{"$lt":1}},{"x":4}]})
update() 数据更新
1.至少接受两个参数(一个限定条件,一个新文档)
post.comments = [] //改值
db.blog.update({title:"My Blog Post"},post) //更新
db.blog.update({title:"My Blog Post"},{$set:{"content":"U R my boby!"}}) //用$set{}进行部分更新
2.upsert 即update的第三个参数值为true,update({},{},true)
db.blog.update({title:"My Blog Week"},{title:"My Blog Week","content":"My weekday very happy!"},true) //实现update insert操作,不存在的数据自动插入
update 默认只更改查找到的第一条信息,更新查到的所有数据用:
>update({x:1},{$set:{x:2}},false,true)
db.blog.find() //查看
想查看更新了多少数据量用命令:
>db.runCommand({getLastError:1})
{
"err":null,
"updatedExisting":true,
"n":5,
"ok":true
}//其中n表示更新文档数
3.返回被更新的文档(findAndModify):
>db.runCommand({"findAndModify":"processes","query":{"status":"READY"},"sort":{"priority":-1},"update":{"$set":{"status":"RUNNING"}})
//但 返回的是更新前的文档。
findAndModify还有很多可以用的字段:
findAndModify=》字符串,集合名;
query=》查询文档,检索文档的条件;
sort=》排序结果条件;
update/remove=》修改器文档(和remove必定指定一个);
new=》布尔类型,表示返回更新前还是更新后的文档,默认是返回更新前的文档;
fields=》文档中需要返回的字段(可选);
upsert=》
>
- remove() 数据删除
在没有条件限定时,会将集合中的所有数据全部永久删除
db.blog.remove({title:"My Blog Post"})
(数据库集合清空:db.collection.drop()
和删除一个文档的时间差不多)
数据修改器
$set / $unset
在update语句中更新(添加)/删除部分内容
修改内嵌文档:
db.blog.posts.update({"author.name":"joe"},{"$set":{"author.name":"joe scheme"}})
$inc
用来增加减少某一整型/长整型/双精度字段
db.games.update({"game":"pinball","user":"joe"},{"$inc":{"score":50}})
$push / $pop
数组元素中增添/删除元素
db.blog.posts.update({"title":"A blog Post"},{"$push":{"comments":{"name":"joe","email":"[email protected]","content":"nice post"}}})
在数组末尾加入一个元素,没有数组自动新建数组。- 同时加入多个元素可以用$each辅助:
db.stock.ticker.update({"_id":"good"},{"$push":{"hourly":{"$each":[25,454,674,66,48]}}})
- 固定数组长度$slice
db.movies.update({"genre":"horror"},{"$push":{"top10":{"$each":["Nightmare","saw"],"slice":-10}}})
会保存最后10个元素
如果保留评分最高的10个,这里可以用到$sort:
db.movies.update({"genre":"horror"},{"$push":{"top10":{"$each":[{"name":"Nightmare","rating":6.7},{"name":"saw","rating":5.9}],"slice":-10,"$sort":{"rating":-1}}}})
$ne / $addToSet
将数组当成数据集(不重复数据)
db.papers.update({"authors cited":{"$ne":"Richie"}},{"$push":{"authors cited":"Richie}})
db.users.update({"_id":"good01"},{"$addToSet":{"email":{"$each":["[email protected]","[email protected]"]}}})
$pop从数据头/尾删除元素{"$pop":-1/1}
而$pull
删除匹配的所有元素`$
定位操作号进行数组数据修改
>db.blog.posts.findOne()
{
"_id":post_id,
"content":"..,.,..,",
"comments":[
{"comment":"good post",
"author":"John",
"votes":0
},
{"comment":"i thought it was too long",
"author":"Claire",
"votes":3
},
{"comment":"free coffe",
"author":"Dan",
"votes":9
}
]
}
// 1.用数据下标
>db.blog.update({"post":post_id},{"$inc":{"comments.0.votes":1}})
//使用$定位符
>db.blog.update({"comments.author":"John"},{"$set":{"comments.$.author":"Jim"}})
//定位符只更新第一个匹配的元素。
修改器速度:
"$inc"不改变文档大小,速度很快;
"$set/$push/insert"会修改集合的填充因子,速度很慢
写入安全机制
- 应答式写入
- 非应答式写入