MongoDB: The Definitive Guide
第一章 简介
MongoDB是面向文档的数据库,不是关系型数据库。内置对MapReduce的支持,以及对地理空间索引的支持。
- 丰富的数据模型
- 容易扩展,它所采用的面向文档的数据模型可以使其在多台服务器之间分割数据
- 丰富的功能,索引、存储Javascript、聚合、固定集合、文件存储
- 不牺牲速度,尽可能地将服务器端处理逻辑交给客户端
- 简便的管理,尽可能地让服务器自动配置
第二章 入门
2.1 文档
文档是MongoDB的核心概念。
- MongoDB不但区分类型,也区分大小写。
- 不能有重复的键。
- 文档的键是字符串,不能含有‘\0’,这个字符用来表示键的结尾
- .和$有特别的意义,被保留
- 以下划线_开头的键是被保留的
2.2 集合
集合就是一组文档。
- 在一个集合里用键标注类型,不如将不同类型分到不同的集合里,这样查询会快很多
- 把同种类型的文档放到一个集合里,这样数据会更加集中
- 索引是按照集合来定义的
命名:
- 集合名不能是空字符串“”
- 集合名不能含有\0字符(空字符)
- 集合名不能以system.开头
- 用户创建的集合名不能含有$
推荐使用子集合来组织数据。以“.”分开的按命名空间划分。
2.3 数据库
多个集合组成数据库。数据库通过名字来标识:
- 不能是空字符串
- 不得含有’’、.、$、/、\、和\0
- 应全部小写
- 最多64字节
保留数据库:admin、local、config
2.4 启动MongoDB
要启动该服务,需要运行mongod可执行文件。
- 默认路径/data/db(C:\data\db);端口27017
- 启动HTTP服务器,监听数字比主端口号高1000 。对于默认端口,就是28017,可访问http://localhost:28017 来获取数据库管理信息。
2.5 MongoDB Shell
运行mongo启动shell。(mongo [host/db: port])
- 功能完备的Javascript解释器,可以充分利用Javascript标准库,可以定义和调用Javascript函数,可以使用多行命令。

MongoDB客户端,全局变量db,用use [db]命令切换数据库
基本操作
- 创建 db.blog.insert(post)
- 读取 db.blog.find() | db.blog.findOne()
- 更新 db.blog.update(condition, new)
- 删除 db.blog.remove(condition)
db.help()可以查看数据库级别的命令的帮助,集合的相关帮助可以通过db.foo.help()来查看。

函数名不写括号,就会显示该函数的Javascript源码。
- 当有属性和目标集合同名时(如version),db.version不能返回正确的collection,这时可以使用getCollection函数:db.getCollection(“version”)
- x.y和x[‘y’]完全等价,db.blog.posts也可以写作db.blog[‘posts’]
var collections = ["posts", "comments", "authors"]
for (i in collections) {
doStuff(db.blog[collections[i]]);
}
2.6 数据类型
基本数据类型、数字、日期(new Date())、数组、内嵌文档等。
- 尽量不要在Shell下覆盖整个文档(整数转化为浮点数)
_id和ObjectId
- ObjectId是_id的默认类型,用12字节的存储空间
- 秒级别的唯一性,大致会按照插入的顺序排列,隐含了文档创建的时间
- _id通常由客户端驱动程序完成
第三章 创建、更新及删除文档
基本的插入删除修改操作
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":"xxx@126.com"}})
db.users.update({"_id":ObjectId("xxxx")},{"$addToSet":{"emails":{"$each":["xxx@126.com", "xxx@hotmail.com"]}}}) //集合中删除值
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/
MongoDB: The Definitive Guide的更多相关文章
- MONGODB的内部构造 FROM 《MONGODB THE DEFINITIVE GUIDE》
今天下载了<MongoDB The Definitive Guide>电子版,浏览了里面的内容,还是挺丰富的.是官网文档实际应用方面的一个补充.和官方文档类似,介绍MongoDB的内部原理 ...
- Introduction to Windows 8: The Definitive Guide for Developer
<Windows 8应用开发权威指南>介绍 Introduction to Windows 8: The Definitive Guide for Developer 一.封面设计要求及文 ...
- THE DEFINITIVE GUIDE TO DEBUGGING JAVASCRIPT
FIGURING OUT WHERE THE ERROR COULD BE READ THE CODE USING THE CONSOLE THE CHROME DEV TOOLS THE DEBUG ...
- Hadoop – The Definitive Guide Examples,,IntelliJ
IntelliJ Project for Building Hadoop – The Definitive Guide Examples http://vichargrave.com/intellij ...
- Pronunciation – The Definitive Guide to the Top 100 Words in American English
Pronunciation – The Definitive Guide to the Top 100 Words in American English Share Tweet Share Tagg ...
- The Definitive Guide to Ruby's C API The Ruby C API Running Ruby in C Running C in Ruby
最近在研究如何在C/C++中 嵌入ruby脚本,很感谢找到了一篇文章,分享一下. The Definitive Guide to Ruby's C API
- MongoDB:The Definitive Guide CHAPTER 2 Getting Started
MongoDB is very powerful, but it is still easy to get started with. In this chapter we’ll introduce ...
- MongoDB:The Definitive Guide CHAPTER 1 Introduction
MongoDB is a powerful, flexible, and scalable data store. It combines the ability to scale out with ...
- Hadoop: The Definitive Guide (3rd Edition)
chapter 1 解决计算能力不足的问题,不是去制造更大的计算机,而是用更多的计算机来解决问题. 我们生活在一个数据的时代.“大数据”的到来不仅仅是影响到那些科研和金融机构,对小型企业以及我们个人都 ...
随机推荐
- 【sqli-labs】 less40 GET -Blind based -String -Stacked(GET型基于盲注的堆叠查询字符型注入)
提交,页面正常,说明是')闭合的 http://192.168.136.128/sqli-labs-master/Less-40/?id=1')%23 http://192.168.136.128/s ...
- Generics of a Higher Kind
http://adriaanm.github.io/files/higher.pdf https://www.atlassian.com/blog/archives/scala-types-of-a- ...
- C# MVC 获得程序运行路径
string filePath = System.Web.HttpContext.Current.Request.MapPath("~/Upload"); //由虚拟路径指定的服务 ...
- Docker 数据卷重复挂载测试
没想到一年没写博客了,这中间都是记在自己的笔记本上,大部分网上都有,这个好像没有,所以发上来吧! 本文是测试Docker容器(相同目录/父子目录)同时挂载到宿主机(同目录/不同目录)时的情况,废话少说 ...
- Node.js 常用Mongoose方法
Node.js 手册查询-Mongoose 方法 一.Schema 一种以文件形式存储的数据库模型骨架,无法直接通往数据库端,也就是说它不具备对数据库的操作能力.可以说是数据属性模型(传统意义的表结构 ...
- count(*)实现原理+两阶段提交总结
count(*)实现原理 不同引擎的实现: MyISAM引擎把表的总行数存在了磁盘上,执行COUNT(*)就会直接返回,效率很高: InnoDB在count(*)时,需要把数据一行一行的从引擎里面取出 ...
- 记Python学习
上周学的Python,感觉有点忘了,现在回顾一下... 一.Python安装及测试:https://www.cnblogs.com/weven/p/7252917.html 例子: Python自带的 ...
- 切换原生appium里面H5页面
#coding = utf-8from appium import webdriverimport time'''1.手机类型2.版本3.手机的唯一标识 deviceName4.app 包名appPa ...
- Selenium的定位元素
1.浏览器操作 # 刷新 driver.refresh() # 前进 driver.forward() # 后退 driver.back() 2.获取标签元素 # 通过ID定位目标元素 dri ...
- BOS工具之BOS应用框架
大纲: 应用框架概述,bos应用框架总体,bos应用框架详细设计,代码结构以及常用应用,开发常用接口 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象组件及组件实例间交互的 ...
