第一章 简介

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. spring 回顾

    主要就是它的IOC理念 即:把对象的创建.初始化.销毁等工作交给spring容器来做 依赖jar

  2. Match 基因匹配 题解(From luoguBlog)

    N<=20000!N2的LCS要原地爆炸. 去您妈的优化考场上有分就行TLE60真香嘿嘿嘿 然而这显然是个板子只不过像我这样见识短浅的蒟蒻不知道罢了 正解: 某大佬的博客 转化为lis后二分 复 ...

  3. 【第一课】kaggle初识

    Evernote Export Crowdflower搜索结果相关性 文件和数据描述 train.csv训练数据集包括: id:产品ID查询:使用的搜索词 product_description:完整 ...

  4. kvm迁移

    一.迁移简介 迁移:      系统的迁移是指把源主机上的操作系统和应用程序移动到目的主机,并且能够在目的主机上正常运行.在没有虚拟机的时代,物理机之间的迁移依靠的是系统备份和恢复技术.在源主机上实时 ...

  5. vue 中引入Jquery插件

    import $ from '../../static/js/jquery.min.js' window.jQuery = $; require('../../static/js/jquery.zoo ...

  6. 线程同步、信号量、system v IPC

    一.线程同步 条件变量 什么是条件变量? 线程A等待某个条件成立,条件成立,线程A才继续向下执行.线程B的执行使条件成立,条件成立以后唤醒线程A,以继续执行.这个条件就是条件变量. pthread_c ...

  7. [luogu3231 HNOI2013] 消毒 (二分图最小点覆盖)

    传送门 Description 最近在生物实验室工作的小T遇到了大麻烦. 由于实验室最近升级的缘故,他的分格实验皿是一个长方体,其尺寸为abc,a.b.c 均为正整数.为了实验的方便,它被划分为abc ...

  8. Ubuntu Server下docker实战 02: docker进阶配置

    在上一篇文章里<Ubuntu Server下docker实战 01: 安装docker>,我们已经把docker安装起来了,并运行了一个hello-world 这一篇,我们继续讲进阶配置. ...

  9. node源码详解(三)

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载保留声明头部与原文链接https://luzeshu.com/blog/nodesource3 本博客同步在https://cnodejs.o ...

  10. Git 基础教程 之 撤销修改

    Git跟踪并管理的是修改,而非文件.每次修改,如果不用git add到暂存区,那就不会加入到commit中, 要么全部改完后,再add → commit :要么改一点,就add → commit. 撤 ...