第一章 简介

MongoDB是面向文档的数据库,不是关系型数据库。内置对MapReduce的支持,以及对地理空间索引的支持。

  • 丰富的数据模型
  • 容易扩展,它所采用的面向文档的数据模型可以使其在多台服务器之间分割数据
  • 丰富的功能,索引、存储Javascript、聚合、固定集合、文件存储
  • 不牺牲速度,尽可能地将服务器端处理逻辑交给客户端
  • 简便的管理,尽可能地让服务器自动配置

第二章 入门

2.1 文档

文档是MongoDB的核心概念。

  • MongoDB不但区分类型,也区分大小写。
  • 不能有重复的键。
  • 文档的键是字符串,不能含有‘\0’,这个字符用来表示键的结尾
  • .和$有特别的意义,被保留
  • 以下划线_开头的键是被保留的

2.2 集合

集合就是一组文档。

  • 在一个集合里用键标注类型,不如将不同类型分到不同的集合里,这样查询会快很多
  • 把同种类型的文档放到一个集合里,这样数据会更加集中
  • 索引是按照集合来定义的

命名:

  1. 集合名不能是空字符串“”
  2. 集合名不能含有\0字符(空字符)
  3. 集合名不能以system.开头
  4. 用户创建的集合名不能含有$

推荐使用子集合来组织数据。以“.”分开的按命名空间划分。

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]命令切换数据库

基本操作

  1. 创建 db.blog.insert(post)
  2. 读取 db.blog.find() | db.blog.findOne()
  3. 更新 db.blog.update(condition, new)
  4. 删除 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的更多相关文章

  1. MONGODB的内部构造 FROM 《MONGODB THE DEFINITIVE GUIDE》

    今天下载了<MongoDB The Definitive Guide>电子版,浏览了里面的内容,还是挺丰富的.是官网文档实际应用方面的一个补充.和官方文档类似,介绍MongoDB的内部原理 ...

  2. Introduction to Windows 8: The Definitive Guide for Developer

    <Windows 8应用开发权威指南>介绍 Introduction to Windows 8: The Definitive Guide for Developer 一.封面设计要求及文 ...

  3. 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 ...

  4. Hadoop – The Definitive Guide Examples,,IntelliJ

    IntelliJ Project for Building Hadoop – The Definitive Guide Examples http://vichargrave.com/intellij ...

  5. 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 ...

  6. 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

  7. 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 ...

  8. MongoDB:The Definitive Guide CHAPTER 1 Introduction

    MongoDB is a powerful, flexible, and scalable data store. It combines the ability to scale out with ...

  9. Hadoop: The Definitive Guide (3rd Edition)

    chapter 1 解决计算能力不足的问题,不是去制造更大的计算机,而是用更多的计算机来解决问题. 我们生活在一个数据的时代.“大数据”的到来不仅仅是影响到那些科研和金融机构,对小型企业以及我们个人都 ...

随机推荐

  1. Android测试写入文本Log

    写入本地SD卡: @SuppressLint("SdCardPath") public void writeFileSdcard(String fileName, String m ...

  2. webpack核心提炼

    基本是学习的时候在网上整理的资料,并非自己原创,这篇文章的的主要目的是记录webpack.config.js的配置方式.可能也有不少错误,欢迎指正!! 一.应用场景 前端模块化开发.功能拓展.css预 ...

  3. GFS分布式文件系统理论个人总结

    GlusterFS 两种模式 可以通过TCP/IP和RDMA高速网络互连,客户端可通过原生Gluster协议访问数据 没有GlusterFS客户端的可以通过NFS/CIFS标准协议通过存储网关访问数据 ...

  4. 复习MySQL②数据类型及约束条件

    数据类型分为数值类型.日期和时间类型.字符串类型 数值类型: – INT:有符号的和无符号的.有符号大小-2147483648~2147483647,无符号大0~4294967295. 宽度最多为11 ...

  5. S-HR薪酬项目与核算表的关系

  6. windows开机自启动bat脚本设置

    群里有朋友问到windows下如何设计开机自启动的脚本,一般而言小鱼大多还是在linux环境下运维,windows的bat了解的很少,windows运行机制也不是特别了解,不过既然朋友问到这个问题,虽 ...

  7. HLPP算法 一种高效的网络最大流算法

    #include <algorithm> #include <cstdio> #include <cctype> #include <queue> #d ...

  8. 51nod1183 编辑距离【动态规划】

    编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除 ...

  9. linux文件的特殊权限及隐藏权限

    基础知识 相信大家应该都知道linux的文件基本权限,使用ls -l命令可以显示文件的基本权限,"-rwxrwxrwx.",第一位表示文件的属性(是文件-  ,目录d等),后面每隔 ...

  10. java陷阱之spring事物管理导致锁无效

    模拟锁情况无效 1.创建一个表 SET NAMES utf8mb4; ; DROP TABLE IF EXISTS `demo`; CREATE TABLE `demo` ( `id` ) NOT N ...