非關係型數據庫----MongoDB

1、什麼是MongoDB?php

  MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。java

  在高負載的狀況下,添加更多的節點,能夠保證服務器性能。mysql

  MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。正則表達式

  MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。sql

     

 

主要特色

  • MongoDB 是一個面向文檔存儲的數據庫,操做起來比較簡單和容易。
  • 你能夠在MongoDB記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
  • 你能夠經過本地或者網絡建立數據鏡像,這使得MongoDB有更強的擴展性。
  • 若是負載的增長(須要更多的存儲空間和更強的處理能力) ,它能夠分佈在計算機網絡中的其餘節點上這就是所謂的分片。
  • Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
  • MongoDb 使用update()命令能夠實現替換完成的文檔(數據)或者一些指定的數據字段 。
  • Mongodb中的Map/reduce主要是用來對數據進行批量處理和聚合操做。
  • Map和Reduce。Map函數調用emit(key,value)遍歷集合中全部的記錄,將key與value傳給Reduce函數進行處理。
  • Map函數和Reduce函數是使用Javascript編寫的,並能夠經過db.runCommand或mapreduce命令來執行MapReduce操做。
  • GridFS是MongoDB中的一個內置功能,能夠用於存放大量小文件。
  • MongoDB容許在服務端執行腳本,能夠用Javascript編寫某個函數,直接在服務端執行,也能夠把函數的定義存儲在服務端,下次直接調用便可。
  • MongoDB支持各類編程語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
  • MongoDB安裝簡單。

 

 

 

 

 

運行 MongoDB

一、首先咱們建立一個數據庫存儲目錄 /data/db:mongodb

sudo mkdir -p /data/db

啓動 mongodb,默認數據庫目錄即爲 /data/db:shell

sudo mongod

# 若是沒有建立全局路徑 PATH,須要進入如下目錄
cd /usr/local/mongodb/bin
sudo ./mongod

再打開一個終端進入執行如下命令:數據庫

$ cd /usr/local/mongodb/bin 
$ ./mongo
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
Welcome to the MongoDB shell.
……
> 1 + 1
2
> 
注意:若是你的數據庫目錄不是/data/db,能夠經過 --dbpath 來指定。

 

MongoDB 概念解析

無論咱們學習什麼數據庫都應該學習其中的基礎概念,在mongodb中基本的概念是文檔、集合、數據庫,下面咱們挨個介紹。express

下表將幫助您更容易理解Mongo中的一些概念:編程

SQL術語/概念 MongoDB術語/概念 解釋/說明
database database 數據庫
table collection 數據庫表/集合
row document 數據記錄行/文檔
column
field
數據字段/域
index index 索引
table joins   錶鏈接,MongoDB不支持
primary key primary key 主鍵,MongoDB自動將_id字段設置爲主鍵

經過下圖實例,咱們也能夠更直觀的瞭解Mongo中的一些概念:

數據庫

一個mongodb中能夠創建多個數據庫。

MongoDB的默認數據庫爲"db",該數據庫存儲在data目錄中。

MongoDB的單個實例能夠容納多個獨立的數據庫,每個都有本身的集合和權限,不一樣的數據庫也放置在不一樣的文件中。

"show dbs" 命令能夠顯示全部數據的列表。

$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
> show dbs
local  0.078GB
test   0.078GB
> 

 執行 "db" 命令能夠顯示當前數據庫對象或集合。

$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
> db
test
> 

 運行"use"命令,能夠鏈接到一個指定的數據庫。

> use local
switched to db local
> db
local
> 

 

以上實例命令中,"local" 是你要連接的數據庫。

 

 

咱們將詳細講解MongoDB中命令的使用。

數據庫也經過名字來標識。數據庫名能夠是知足如下條件的任意UTF-8字符串。

  • 不能是空字符串("")。
  • 不得含有' '(空格)、.、$、/、\和\0 (空字符)。
  • 應所有小寫。
  • 最多64字節。

有一些數據庫名是保留的,能夠直接訪問這些有特殊做用的數據庫。

  • admin: 從權限的角度來看,這是"root"數據庫。要是將一個用戶添加到這個數據庫,這個用戶自動繼承全部數據庫的權限。一些特定的服務器端命令也只能從這個數據庫運行,好比列出全部的數據庫或者關閉服務器。
  • local: 這個數據永遠不會被複制,能夠用來存儲限於本地單臺服務器的任意集合
  • config: 當Mongo用於分片設置時,config數據庫在內部使用,用於保存分片的相關信息。

 

文檔(Document)

文檔是一組鍵值(key-value)對(即 BSON)。MongoDB 的文檔不須要設置相同的字段,而且相同的字段不須要相同的數據類型,這與關係型數據庫有很大的區別,也是 MongoDB 很是突出的特色。

一個簡單的文檔例子以下:

{"site":"www.baidu.com", "name":"百度"}

 下表列出了 RDBMS 與 MongoDB 對應的術語:

RDBMS MongoDB
數據庫 數據庫
表格 集合
文檔
字段
表聯合 嵌入文檔
主鍵 主鍵 (MongoDB 提供了 key 爲 _id )
數據庫服務和客戶端
Mysqld/Oracle mongod
mysql/sqlplus mongo

 

須要注意的是:

  1. 文檔中的鍵/值對是有序的。
  2. 文檔中的值不只能夠是在雙引號裏面的字符串,還能夠是其餘幾種數據類型(甚至能夠是整個嵌入的文檔)。
  3. MongoDB區分類型和大小寫。
  4. MongoDB的文檔不能有重複的鍵。
  5. 文檔的鍵是字符串。除了少數例外狀況,鍵可使用任意UTF-8字符。

文檔鍵命名規範:

  • 鍵不能含有\0 (空字符)。這個字符用來表示鍵的結尾。
  • .和$有特別的意義,只有在特定環境下才能使用。
  • 如下劃線"_"開頭的鍵是保留的(不是嚴格要求的)。

 

集合

集合就是 MongoDB 文檔組,相似於 RDBMS (關係數據庫管理系統:Relational Database Management System)中的表格。

集合存在於數據庫中,集合沒有固定的結構,這意味着你在對集合能夠插入不一樣格式和類型的數據,但一般狀況下咱們插入集合的數據都會有必定的關聯性。

 

好比,咱們能夠將如下不一樣數據結構的文檔插入到集合中:

{"site":"www.baidu.com"}
{"site":"www.google.com","name":"Google"}
{"site":"www.jd.com","name":"京東商城","num":5}

 當第一個文檔插入時,集合就會被建立。

合法的集合名

  • 集合名不能是空字符串""。
  • 集合名不能含有\0字符(空字符),這個字符表示集合名的結尾。
  • 集合名不能以"system."開頭,這是爲系統集合保留的前綴。
  • 用戶建立的集合名字不能含有保留字符。有些驅動程序的確支持在集合名裏面包含,這是由於某些系統生成的集合中包含該字符。除非你要訪問這種系統建立的集合,不然千萬不要在名字裏出現$。 

以下實例:

 

 

 

 

MongoDB 數據類型

下表爲MongoDB中經常使用的幾種數據類型。

數據類型 描述
String 字符串。存儲數據經常使用的數據類型。在 MongoDB 中,UTF-8 編碼的字符串纔是合法的。
Integer 整型數值。用於存儲數值。根據你所採用的服務器,可分爲 32 位或 64 位。
Boolean 布爾值。用於存儲布爾值(真/假)。
Double 雙精度浮點值。用於存儲浮點值。
Min/Max keys 將一個值與 BSON(二進制的 JSON)元素的最低值和最高值相對比。
Array 用於將數組或列表或多個值存儲爲一個鍵。
Timestamp 時間戳。記錄文檔修改或添加的具體時間。
Object 用於內嵌文檔。
Null 用於建立空值。
Symbol 符號。該數據類型基本上等同於字符串類型,但不一樣的是,它通常用於採用特殊符號類型的語言。
Date 日期時間。用 UNIX 時間格式來存儲當前日期或時間。你能夠指定本身的日期時間:建立 Date 對象,傳入年月日信息。
Object ID 對象 ID。用於建立文檔的 ID。
Binary Data 二進制數據。用於存儲二進制數據。
Code 代碼類型。用於在文檔中存儲 JavaScript 代碼。
Regular expression 正則表達式類型。用於存儲正則表達式。

下面說明下幾種重要的數據類型。

ObjectId

ObjectId 相似惟一主鍵,能夠很快的去生成和排序,包含 12 bytes,含義是:

  • 前 4 個字節表示建立 unix 時間戳,格林尼治時間 UTC 時間,比北京時間晚了 8 個小時
  • 接下來的 3 個字節是機器標識碼
  • 緊接的兩個字節由進程 id 組成 PID
  • 最後三個字節是隨機數

MongoDB 中存儲的文檔必須有一個 _id 鍵。這個鍵的值能夠是任何類型的,默認是個 ObjectId 對象

因爲 ObjectId 中保存了建立的時間戳,因此你不須要爲你的文檔保存時間戳字段,你能夠經過 getTimestamp 函數來獲取文檔的建立時間:

> var newObject = ObjectId()
> newObject.getTimestamp()

 ObjectId 轉爲字符串

> newObject.str

 

 

 

 

 

 

-------------------------------------------------

MongoDB - 鏈接

啓動 MongoDB 服務

你只須要在 MongoDB 安裝目錄的 bin 目錄下執行 mongodb 便可。

執行啓動操做後,mongodb 在輸出一些必要信息後不會輸出任何信息,以後就等待鏈接的創建,當鏈接被創建後,就會開始打印日誌信息。

你可使用 MongoDB shell 來鏈接 MongoDB 服務器。你也可使用 PHP 來鏈接 MongoDB。本教程咱們會使用 MongoDB shell 來鏈接 Mongodb 服務,以後的章節咱們將會介紹如何經過php 來鏈接MongoDB服務。

標準 URI 鏈接語法:

 

 

 

 

 

 

 

 

 

-----------------------

 

MongoDB 建立數據庫

語法

MongoDB 建立數據庫的語法格式以下:

use DATABASE_NAME

 若是數據庫不存在,則建立數據庫,不然切換到指定數據庫。

實例

如下實例咱們建立了數據庫 library:

> use library
switched to db library
> db
library
> 

若是你想查看全部數據庫,可使用 show dbs 命令:

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> 

能夠看到,咱們剛建立的數據庫 library 並不在數據庫的列表中, 要顯示它,咱們須要向 library 數據庫插入一些數據。

> db.library.insert({"name":"圖書管理系統"})
WriteResult({ "nInserted" : 1 })
> show dbs
admin    0.000GB
config   0.000GB
library  0.000GB
local    0.000GB
> 

 

MongoDB 中默認的數據庫爲 test,若是你沒有建立新的數據庫,集合將存放在 test 數據庫中。

注意: 在 MongoDB 中,集合只有在內容插入後纔會建立! 就是說,建立集合(數據表)後要再插入一個文檔(記錄),集合纔會真正建立。

 

----------------------

 

MongoDB 刪除數據庫

語法

MongoDB 刪除數據庫的語法格式以下:

db.dropDatabase()

刪除當前數據庫,默認爲 test,你可使用 db 命令查看當前數據庫名。

 

實例

如下實例咱們刪除了數據庫 runoob。

首先,查看全部數據庫:

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> 

接下來咱們切換到數據庫 runoob:

> use library
switched to db library

執行刪除命令:

> db.dropDatabase()
{ "dropped" : "library", "ok" : 1 }
> 

最後,咱們再經過 show dbs 命令數據庫是否刪除成功:

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> 

 

刪除集合

集合刪除語法格式以下:

db.collection.drop()

如下實例刪除了 library 數據庫中的集合 publish:

> use library
switched to db library
> 
> 
> db.books.insert({"name":"紅樓夢"})
WriteResult({ "nInserted" : 1 })
> db.publish.insert({"name":"北京出版社"})
WriteResult({ "nInserted" : 1 })
> db.author.insert({"name":"張仁國"})
WriteResult({ "nInserted" : 1 })
> 
> 
> 
> show tables
author
books
publish
> 
> 
> db.author.drop()
true
> 

 

 

 

-------------------

MongoDB 建立集合

本章節咱們爲你們介紹如何使用 MongoDB 來建立集合。

MongoDB 中使用 createCollection() 方法來建立集合。

語法格式:

db.createCollection(name, options)

 

參數說明:

  • name: 要建立的集合名稱
  • options: 可選參數, 指定有關內存大小及索引的選項

options 能夠是以下參數:

 

字段 類型 描述
capped 布爾 (可選)若是爲 true,則建立固定集合。固定集合是指有着固定大小的集合,當達到最大值時,它會自動覆蓋最先的文檔。
當該值爲 true 時,必須指定 size 參數。
autoIndexId 布爾 (可選)如爲 true,自動在 _id 字段建立索引。默認爲 false。
size 數值 (可選)爲固定集合指定一個最大值(以字節計)。
若是 capped 爲 true,也須要指定該字段。
max 數值 (可選)指定固定集合中包含文檔的最大數量。

 

在插入文檔時,MongoDB 首先檢查固定集合的 size 字段,而後檢查 max 字段。

實例

在 test 數據庫中建立 library 集合:

> use test
switched to db test
> db.createCollection("library")
{ "ok" : 1 }
> 

 

若是要查看已有集合,可使用 show collections 命令:

> show collections
library
> 

 

下面是帶有幾個關鍵參數的 createCollection() 的用法:

建立固定集合 mycol,整個集合空間大小 6142800 KB, 文檔最大個數爲 10000 個

> db.createCollection("mycol", { capped : true, autoIndexId : true, size : 
...    6142800, max : 10000 } )
{
    "note" : "the autoIndexId option is deprecated and will be removed in a future release",
    "ok" : 1
}
> 

 

 MongoDB 中,你不須要建立集合。當你插入一些文檔時,MongoDB 會自動建立集合。

> db.url.insert({"name":"路由"})
WriteResult({ "nInserted" : 1 })
> show collections
library
mycol
url
> 

 

 

--------------------

MongoDB 刪除集合

本章節咱們爲你們介紹如何使用 MongoDB 來刪除集合。

MongoDB 中使用 drop() 方法來刪除集合。

語法格式:

db.collection.drop()

 

參數說明:

返回值

若是成功刪除選定集合,則 drop() 方法返回 true,不然返回 false。

實例

在數據庫 test 中,咱們能夠先經過 show collections 命令查看已存在的集合:

> use test
switched to db test
> show collections
library
mycol
url

接着刪除集合 url:

> db.url.drop()
true
> 
> 

經過 show collections 再次查看數據庫 mydb 中的集合:

> show collections
library
mycol
> 

從結果中能夠看出 mycol2 集合已被刪除。

 

---------------------

MongoDB 插入文檔

本章節中咱們將向你們介紹如何將數據插入到MongoDB的集合中。

文檔的數據結構和JSON基本同樣。

全部存儲在集合中的數據都是BSON格式。

BSON是一種類json的一種二進制形式的存儲格式,簡稱Binary JSON。

插入文檔

MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,語法以下:

db.COLLECTION_NAME.insert(document)

 

如下文檔能夠存儲在 MongoDB 的 runoob 數據庫 的 col 集合中:

> use runoob
switched to db runoob
> db.col.insert({title:"Mongo 教程",description:"MongoDB 是一個Nosql 數據庫",url:"baidu.com",tages:['mongodb','database','Nosql']})
WriteResult({ "nInserted" : 1 })
> 

以上實例中 col 是咱們的集合名,若是該集合不在該數據庫中, MongoDB 會自動建立該集合並插入文檔。

查看已插入文檔:

> db.col.find()
{ "_id" : ObjectId("5c873ba1684bc0bda7811a41"), "title" : "Mongo 教程", "description" : "MongoDB 是一個Nosql 數據庫", "url" : "baidu.com", "tages" : [ "mongodb", "database", "Nosql" ] }
> 

 

咱們也能夠將數據定義爲一個變量,以下所示:

> document=({title: 'MongoDB 教程', 
    description: 'MongoDB 是一個 Nosql 數據庫',
    by: '菜鳥教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
});

執行後顯示結果以下:

{
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一個 Nosql 數據庫",
        "by" : "菜鳥教程",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}

 

執行插入操做:

> db.col.insert(document)
WriteResult({ "nInserted" : 1 })
> 

插入文檔你也可使用 db.col.save(document) 命令。若是不指定 _id 字段 save() 方法相似於 insert() 方法。若是指定 _id 字段,則會更新該 _id 的數據。

***************

3.2 版本後還有如下幾種語法可用於插入文檔:

  •  db.collection.insertOne():向指定集合中插入一條文檔數據
  •  db.collection.insertMany():向指定集合中插入多條文檔數據
#  插入單條數據

> var document = db.collection.insertOne({"a": 3})
> document
{
        "acknowledged" : true,
        "insertedId" : ObjectId("571a218011a82a1d94c02333")
}

#  插入多條數據
> var res = db.collection.insertMany([{"b": 3}, {'c': 4}])
> res
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("571a22a911a82a1d94c02337"),
                ObjectId("571a22a911a82a1d94c02338")
        ]
}

 

-----------------------

 

MongoDB 更新文檔

MongoDB 使用 update() 和 save() 方法來更新集合中的文檔。接下來讓咱們詳細來看下兩個函數的應用及其區別。

update() 方法

update() 方法用於更新已存在的文檔。語法格式以下:

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

參數說明:

  • query : update的查詢條件,相似sql update查詢內where後面的。
  • update : update的對象和一些更新的操做符(如$,$inc...)等,也能夠理解爲sql update查詢內set後面的
  • upsert : 可選,這個參數的意思是,若是不存在update的記錄,是否插入objNew,true爲插入,默認是false,不插入。
  • multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,若是這個參數爲true,就把按條件查出來多條記錄所有更新。
  • writeConcern :可選,拋出異常的級別。

實例

咱們在集合 col 中插入以下數據:

>db.col.insert({
    title: 'MongoDB 教程', 
    description: 'MongoDB 是一個 Nosql 數據庫',
    by: '菜鳥教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

接着咱們經過 update() 方法來更新標題(title):

>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })   # 輸出信息
> db.col.find().pretty()
{
        "_id" : ObjectId("56064f89ade2f21f36b03136"),
        "title" : "MongoDB",
        "description" : "MongoDB 是一個 Nosql 數據庫",
        "by" : "菜鳥教程",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}
>

能夠看到標題(title)由原來的 "MongoDB 教程" 更新爲了 "MongoDB"。

以上語句只會修改第一條發現的文檔,若是你要修改多條相同的文檔,則須要設置 multi 參數爲 true。

>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})

save() 方法

save() 方法經過傳入的文檔來替換已有文檔。語法格式以下:

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)

參數說明:

  • document : 文檔數據。
  • writeConcern :可選,拋出異常的級別。

實例

如下實例中咱們替換了 _id 爲 56064f89ade2f21f36b03136 的文檔數據:

>db.col.save({
    "_id" : ObjectId("56064f89ade2f21f36b03136"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一個 Nosql 數據庫",
    "by" : "Runoob",
    "url" : "http://www.runoob.com",
    "tags" : [
            "mongodb",
            "NoSQL"
    ],
    "likes" : 110
})

替換成功後,咱們能夠經過 find() 命令來查看替換後的數據

>db.col.find().pretty()
{
        "_id" : ObjectId("56064f89ade2f21f36b03136"),
        "title" : "MongoDB",
        "description" : "MongoDB 是一個 Nosql 數據庫",
        "by" : "Runoob",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "NoSQL"
        ],
        "likes" : 110
}
> 

 

 

 

 

更多實例

只更新第一條記錄:

db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );

所有更新:

db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );

只添加第一條:

db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );

所有添加進去:

db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );

所有更新:

db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );

只更新第一條記錄:

db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );

 

 

在3.2版本開始,MongoDB提供如下更新集合文檔的方法:

  • db.collection.updateOne() 向指定集合更新單個文檔
  • db.collection.updateMany() 向指定集合更新多個文檔

首先咱們在test集合裏插入測試數據

use test
db.test_collection.insert( [
{"name":"abc","age":"25","status":"zxc"},
{"name":"dec","age":"19","status":"qwe"},
{"name":"asd","age":"30","status":"nmn"},
] )

更新單個文檔

> db.test_collection.updateOne({"name":"abc"},{$set:{"age":"28"}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.test_collection.find()
{ "_id" : ObjectId("59c8ba673b92ae498a5716af"), "name" : "abc", "age" : "28", "status" : "zxc" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b0"), "name" : "dec", "age" : "19", "status" : "qwe" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b1"), "name" : "asd", "age" : "30", "status" : "nmn" }
>

更新多個文檔

> db.test_collection.updateMany({"age":{$gt:"10"}},{$set:{"status":"xyz"}})
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
> db.test_collection.find()
{ "_id" : ObjectId("59c8ba673b92ae498a5716af"), "name" : "abc", "age" : "28", "status" : "xyz" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b0"), "name" : "dec", "age" : "19", "status" : "xyz" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b1"), "name" : "asd", "age" : "30", "status" : "xyz" }
>

 

 

  • WriteConcern.NONE:沒有異常拋出
  • WriteConcern.NORMAL:僅拋出網絡錯誤異常,沒有服務器錯誤異常
  • WriteConcern.SAFE:拋出網絡錯誤異常、服務器錯誤異常;並等待服務器完成寫操做。
  • WriteConcern.MAJORITY: 拋出網絡錯誤異常、服務器錯誤異常;並等待一個主服務器完成寫操做。
  • WriteConcern.FSYNC_SAFE: 拋出網絡錯誤異常、服務器錯誤異常;寫操做等待服務器將數據刷新到磁盤。
  • WriteConcern.JOURNAL_SAFE:拋出網絡錯誤異常、服務器錯誤異常;寫操做等待服務器提交到磁盤的日誌文件。
  • WriteConcern.REPLICAS_SAFE:拋出網絡錯誤異常、服務器錯誤異常;等待至少2臺服務器完成寫操做。

移除集合中的鍵值對,使用的 $unset 操做符:

語法:

{ $unset: { <field1>: "", ... } }

若是指定的字段不存在則操做不作任何處理。

db.col.update({"_id":"56064f89ade2f21f36b03136"}, {$set:{ "test2" : "OK"}})
db.col.find()

db.col.update({"_id":"56064f89ade2f21f36b03136"}, {$unset:{ "test2" : "OK"}})
db.col.find()

 

 

 

 

 

---------------------

MongoDB 查詢文檔

MongoDB 查詢文檔使用 find() 方法。

find() 方法以非結構化的方式來顯示全部文檔。

語法

MongoDB 查詢數據的語法格式以下:

db.collection.find(query, projection)
  • query :可選,使用查詢操做符指定查詢條件
  • projection :可選,使用投影操做符指定返回的鍵。查詢時返回文檔中全部鍵值, 只需省略該參數便可(默認省略)。

若是你須要以易讀的方式來讀取數據,可使用 pretty() 方法,語法格式以下:

>db.col.find().pretty()

pretty() 方法以格式化的方式來顯示全部文檔。

實例

如下實例咱們查詢了集合 col 中的數據:

> db.col.find().pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一個 Nosql 數據庫",
        "by" : "菜鳥教程",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}

除了 find() 方法以外,還有一個 findOne() 方法,它只返回一個文檔。

MongoDB 與 RDBMS Where 語句比較

若是你熟悉常規的 SQL 數據,經過下表能夠更好的理解 MongoDB 的條件語句查詢:

 

操做 格式 範例 RDBMS中的相似語句
等於 {<key>:<value>} db.col.find({"by":"菜鳥教程"}).pretty() where by = '菜鳥教程'
小於 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小於或等於 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大於 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大於或等於 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等於 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

MongoDB AND 條件

MongoDB 的 find() 方法能夠傳入多個鍵(key),每一個鍵(key)以逗號隔開,即常規 SQL 的 AND 條件。

語法格式以下:

>db.col.find({key1:value1, key2:value2}).pretty()

實例

如下實例經過 by 和 title 鍵來查詢 菜鳥教程 中 MongoDB 教程 的數據

> db.col.find({"by":"菜鳥教程", "title":"MongoDB 教程"}).pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一個 Nosql 數據庫",
        "by" : "菜鳥教程",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}

以上實例中相似於 WHERE 語句:WHERE by='菜鳥教程' AND title='MongoDB 教程'


MongoDB OR 條件

MongoDB OR 條件語句使用了關鍵字 $or,語法格式以下:

>db.col.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()

實例

如下實例中,咱們演示了查詢鍵 by 值爲 菜鳥教程 或鍵 title 值爲 MongoDB 教程 的文檔。

>db.col.find({$or:[{"by":"菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一個 Nosql 數據庫",
        "by" : "菜鳥教程",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}
>

AND 和 OR 聯合使用

如下實例演示了 AND 和 OR 聯合使用,相似常規 SQL 語句爲: 'where likes>50 AND (by = '菜鳥教程' OR title = 'MongoDB 教程')'

>db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()
{
        "_id" : ObjectId("56063f17ade2f21f36b03133"),
        "title" : "MongoDB 教程",
        "description" : "MongoDB 是一個 Nosql 數據庫",
        "by" : "菜鳥教程",
        "url" : "http://www.runoob.com",
        "tags" : [
                "mongodb",
                "database",
                "NoSQL"
        ],
        "likes" : 100
}

補充一下 projection 參數的使用方法

db.collection.find(query, projection)

若不指定 projection,則默認返回全部鍵,指定 projection 格式以下,有兩種模式

db.collection.find(query, {title: 1, by: 1}) // inclusion模式 指定返回的鍵,不返回其餘鍵
db.collection.find(query, {title: 0, by: 0}) // exclusion模式 指定不返回的鍵,返回其餘鍵

_id 鍵默認返回,須要主動指定 _id:0 纔會隱藏

兩種模式不可混用(由於這樣的話沒法推斷其餘鍵是否應返回)

db.collection.find(query, {title: 1, by: 0}) // 錯誤

只能全1或全0,除了在inclusion模式時能夠指定_id爲0

db.collection.find(query, {_id:0, title: 1, by: 1}) // 正確

若不想指定查詢條件參數 query 能夠 用 {} 代替,可是須要指定 projection 參數:

querydb.collection.find({}, {title: 1})

若是是 qty 大於 50 小於 80 不能這樣寫:

db.posts.find( {  qty: { $gt: 50 }, qty: { $lt: 80 } } )

應該這樣:

db.posts.find( {  qty: { $gt: 50 ,$lt: 80}} )

 

 

 

 

 

---------------

MongoDB 條件操做符

描述

條件操做符用於比較兩個表達式並從mongoDB集合中獲取數據。

在本章節中,咱們將討論如何在MongoDB中使用條件操做符。

MongoDB中條件操做符有:

  • (>) 大於 - $gt
  • (<) 小於 - $lt
  • (>=) 大於等於 - $gte
  • (<= ) 小於等於 - $lte

咱們使用的數據庫名稱爲"runoob" 咱們的集合名稱爲"col",如下爲咱們插入的數據。

爲了方便測試,咱們能夠先使用如下命令清空集合 "col" 的數據:

db.col.remove({})

插入如下數據

>db.col.insert({
    title: 'PHP 教程', 
    description: 'PHP 是一種建立動態交互性站點的強有力的服務器端腳本語言。',
    by: '菜鳥教程',
    url: 'http://www.runoob.com',
    tags: ['php'],
    likes: 200
})
>db.col.insert({title: 'Java 教程', 
    description: 'Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。',
    by: '菜鳥教程',
    url: 'http://www.runoob.com',
    tags: ['java'],
    likes: 150
})
>db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一個 Nosql 數據庫',
    by: '菜鳥教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb'],
    likes: 100
})

使用find()命令查看數據:

> db.col.find()
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種建立動態交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }

MongoDB (>) 大於操做符 - $gt

若是你想獲取 "col" 集合中 "likes" 大於 100 的數據,你可使用如下命令:

db.col.find({likes : {$gt : 100}})

相似於SQL語句:

Select * from col where likes > 100;

輸出結果:

> db.col.find({likes : {$gt : 100}})
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種建立動態交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
> 

MongoDB(>=)大於等於操做符 - $gte

若是你想獲取"col"集合中 "likes" 大於等於 100 的數據,你可使用如下命令:

db.col.find({likes : {$gte : 100}})

相似於SQL語句:

Select * from col where likes >=100;

輸出結果:

> db.col.find({likes : {$gte : 100}})
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種建立動態交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
> 

MongoDB (<) 小於操做符 - $lt

若是你想獲取"col"集合中 "likes" 小於 150 的數據,你可使用如下命令:

db.col.find({likes : {$lt : 150}})

相似於SQL語句:

Select * from col where likes < 150;

輸出結果:

> db.col.find({likes : {$lt : 150}})
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }

MongoDB (<=) 小於操做符 - $lte

若是你想獲取"col"集合中 "likes" 小於等於 150 的數據,你可使用如下命令:

db.col.find({likes : {$lte : 150}})

相似於SQL語句:

Select * from col where likes <= 150;

輸出結果:

> db.col.find({likes : {$lte : 150}})
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }

MongoDB 使用 (<) 和 (>) 查詢 - $lt 和 $gt

若是你想獲取"col"集合中 "likes" 大於100,小於 200 的數據,你可使用如下命令:

db.col.find({likes : {$lt :200, $gt : 100}})

相似於SQL語句:

Select * from col where likes>100 AND  likes<200;

輸出結果:

> db.col.find({likes : {$lt :200, $gt : 100}})
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
> 

 

 

一些簡寫說明:

$gt -------- greater than  >

$gte --------- gt equal  >=

$lt -------- less than  <

$lte --------- lt equal  <=

$ne ----------- not equal  !=

$eq  --------  equal  =

模糊查詢

查詢 title 包含"教"字的文檔:

db.col.find({title:/教/})

查詢 title 字段以"教"字開頭的文檔:

db.col.find({title:/^教/})

查詢 titl e字段以"教"字結尾的文檔:

db.col.find({title:/教$/})
相關文章
相關標籤/搜索