概念
MongoDB是面向文档的数据库,不是关系型数据库。放弃关系模型的主要原因就是为了获得更加方便的扩展性。
基本思路就是将原来“行”的概念换成更加灵活的“文档”模型。面向文档的一条记录就可以表示非常复杂的层次关系方式可以将文档或者数组内嵌进来,所以用一条记录就可以表示非常复杂的层次关系。
功能
索引,存储javascript,聚合,固定集合,文件存储
文档
文档是MongoDB的核心概念。多个键及其关联的值有序地放置在一起就是文档
文档不能有重复的键
区分大小写
集合
集合就是一组文档。类似于关系型数据库里的表
启动MongoDB
windows:进入到MongoDB下面的bin文件夹,运行mongod.exe
查看数据库
show dbs
选择要使用的数据库
use 数据库名
查看集合
show tables
创建集合
db.createCollection(集合名)
删除集合
db.drop_collection(集合名)
查看文档
db.集合名.find()
查看一条文档
db.集合名.findOne()
插入文档
db.集合名.insert({"键":"值"})
更新文档
db.集合名.update({要更新文档的限定条件},{新的文档})
删除文档
db.集合名.remove({要删除文档的限定条件})
使用修改器
通常文档只会有一部分要更新。利用原子的更新修改器,可以使得这种部分更新极为高效。
$set修改器入门
$unset 删除键
"$set"用来指定一个键的值,如果这个键不存在,则创建它,存在就修改
> db.analytics.find() { "_id" : ObjectId("5a654d25e2602fccd336b767"), "url" : "www.example.com", "pageviews" : 53 } > db.analytics.update({"url":"www.example.com"},{"$set":{"message":"python"}}) > db.analytics.find() { "_id" : ObjectId("5a654d25e2602fccd336b767"), "url" : "www.example.com", "pageviews" : 53, "message" : "python" }
> db.blog.find() { "_id" : ObjectId("5a6550f2e2602fccd336b768"), "title" : "A Blog Post", "content" : "...", "author" : { "name" : "joe", "email" : "[email protected]" } } > db.blog.update({"author.name":"joe"},{"$set":{"author.name":"joe schmoe"}}) > db.blog.find() { "_id" : ObjectId("5a6550f2e2602fccd336b768"), "title" : "A Blog Post", "content" : "...", "author" : { "name" : "joe schmoe", "email" : "[email protected]" } }
$inc增加和减少
"inc"修改器用来增加已有键的值,或者在键不存在时创建一个键
> db.games.find() { "_id" : ObjectId("5a65544ce2602fccd336b769"), "game" : "pinball", "user" : "joe" } > db.games.update({"game":"pinball",{"$inc":{"score":50}}}) > db.games.find() { "_id" : ObjectId("5a65544ce2602fccd336b769"), "game" : "pinball", "user" : "joe", "score" : 50 }
增加次数$inc,只针对数字类型,如果键存在,则增加,不存在,则创建
{ "_id" : ObjectId("5a654d25e2602fccd336b767"), "url" : "www.example.com", "pageviews" : 52 } db.analytics.update({"url":"www.example.com"},{"$inc":{"pageviews":1}}) > db.analytics.find() { "_id" : ObjectId("5a654d25e2602fccd336b767"), "url" : "www.example.com", "pageviews" : 53 }
数组修改器
数组操作,顾名思义,只能用在值为数组的键上。例如不能对整数做push,也不能对字符串做pop。使用"$set"或"$inc"来修改标量值
如果指定的键已经存在,"push"会向已有的数组末尾加入一个元素,要是没有就会创建一个新的数组。
> db.games.find() { "_id" : ObjectId("5a65544ce2602fccd336b769"), "game" : "pinball", "user" : "joe", "score" : 51 } > db.games.update({"game":"pinball"},{$push:{"comments":{"name":"joe","content":"nice post."}}}) > db.games.find() { "_id" : ObjectId("5a65544ce2602fccd336b769"), "game" : "pinball", "user" : "joe", "score" : 51, "comments" : [ { "name" : "joe", "content" : "nice post." } ] }
经常会有这种情况,如果一个值不在数组里面就把它加进去。keyi在查询文档中用"ne"来实现。例如,要是作者不在引文列表中就添加进去,可以这样做
> db.papers.find() { "_id" : ObjectId("5a655a0ce2602fccd336b76a"), "authors cited" : "joe" } > db.papers.update({"authors cited":{"$ne":"Richie"}},{$set:{"authors cited":"Richie"}}) > db.papers.find() { "_id" : ObjectId("5a655a0ce2602fccd336b76a"), "authors cited" : "Richie" }
用$addToSet可以避免重复