第一章 简介
MongoDB是面向文档的数据库,不是关系型数据库。内置对MapReduce的支持,以及对地理空间索引的支持。
第二章 入门
2.1 文档
文档是MongoDB的核心概念。
2.2 集合
集合就是一组文档。
命名:
推荐使用子集合来组织数据。以“.”分开的按命名空间划分。
2.3 数据库
多个集合组成数据库。数据库通过名字来标识:
保留数据库:admin、local、config
2.4 启动MongoDB
要启动该服务,需要运行mongod可执行文件。
2.5 MongoDB Shell
运行mongo启动shell。(mongo [host/db: port])
MongoDB客户端,全局变量db,用use [db]命令切换数据库
基本操作
db.help()可以查看数据库级别的命令的帮助,集合的相关帮助可以通过db.foo.help()来查看。
函数名不写括号,就会显示该函数的Javascript源码。
var collections = ["posts", "comments", "authors"] for (i in collections) { doStuff(db.blog[collections[i]]); }
2.6 数据类型
基本数据类型、数字、日期(new Date())、数组、内嵌文档等。
_id和ObjectId
第三章 创建、更新及删除文档
基本的插入删除修改操作
db.foo.insert({"bar":"baz"}) db.users.remove() db.mailing.list.remove({"opt-out":true}) start = time.time() db.drop_collection("bar") joe.relationships={"friends":joe.friends,"enimies":joe.enimies}; delete joe.friends; delete joe.enimies; db.users.update({"name":"joe"}, joe)
使用修改器$set, $inc, $ne, $push, $addToSet, $each
//添加或删除键值 db.users.update({"name":"joe"}, {"$set":{"favorite book":"war and peace"}}) db.users.update({"name":"joe"}, {"$unset":{"favorite book":1}}) //增减数值 db.games.update({"game":"pinball", "user":"joe"}, {"$inc":{"score":50}}) //向数组添加值 db.papers.update({"authors cited":{"$ne":"Richie"}}, {"$push":{"authors cited":"Richie"}}) //集合中增加值,避免重复 db.users.update({"_id":ObjectId("xxxx")},{"$addToSet":{"emails":"[email protected]"}}) db.users.update({"_id":ObjectId("xxxx")},{"$addToSet":{"emails":{"$each":["[email protected]", "[email protected]"]}}}) //集合中删除值 db.lists.insert("todo":["dishes","laundry","dry cleaning"]) db.lists.update({},{"$pull":{"todo":1}}) //从数组末尾删除 db.lists.update({},{"$pop":{"todo":-1}}) //从数组开头删除 //数组定位 db.blog.update({"post":post_id},{"$inc":{"comments.0.votes":1}}) //用下标 db.blog.update({"comments.author":"John"},{"$set":{"comments.$.author":"Jim"}}) //只替换第一个
同一套代码既创建又更新文档——upset
要是没有文档符合更新条件,就会以这个条件和更新文档为基础创建一个新的文档。如果找到了匹配的文档,则正常更新。
//update的第3个参数表示这个是upsert db.analytics.update({"url":"/blog"}, {"$inc":{"visits":1}}, true)
save Shell帮助程序
save是一个Shell函数,可以在文档不存在时插入,存在时更新。要是文档含有_id键,save会调用upsert,否则会调用插入。
> var x = db.foo.findOne() > x.num = 42 42 > db.foo.save(x)
更新多个文档
//要使匹配到的文档都得到更新,可以设置update的第4个参数为true > db.users.update({birthday:"10/13/1978"}, ... {$set:{gift:"Happy Birthday!"}}, false, true) //要知道更新了多少文档 > db.runCommand({getLastError: 1})
返回已更新的文档
> ps = db.runCommand({"findAndModify":"processes", ... "query":{"status":"READY"}, ... "sort":{"priority":-1}, ... "update":{"$set":{"status":"RUNNING"}}).value > doSomething(ps) > db.processes.update({"_id":ps._id},{"$set":{"status":"DONE"}})
数据库会为每一个MongoDB数据库连接创建一个队列。
更多精彩内容,@https://www.mongodb.org/