1. 程式人生 > >MongoDB基礎篇:MongoDB Shell命令大全

MongoDB基礎篇:MongoDB Shell命令大全

要想能熟練操作MongoDB,首先先要熟練使用 MongoDB Shell, 再次要熟練使用驅動 mongodb-java-driver, 最後是spring-data-mongodb的使用

MongoDB 簡介:

MongoDB採用Bson格式儲存,BSON格式比JSON資料型別更加豐富,
支援ObjectId、日期型別、正則表示式、JS程式碼、二進位制資料等

MongoDB注意:

  • MongoDB 不支援事務
  • MongoDB 不支援多表連線查詢
  • MongoDB 中的鍵值對是有序的,相同的鍵值對,不同的順序,屬於不同的文件
  • new Date(); 返回日期物件,屬於日期型別,Date()函式返回日期字串,在Shell中操作日期要使用日期型別, 日期型別是包含時區的
  • _id的值可以是任意型別,預設是ObjectId型別,可以在分片環境中生成唯一的識別符號(時間戳(單位:秒)+主機的唯一標示(主機名的hash值)+程序識別符號PID+自動增加的計數器), 通過時間戳可以大概知道ObjectId大概是按時間先後排序的,主機的唯一標示可以用於保證在多臺伺服器器上不重複,程序ID為了保證同臺伺服器器上多個不同的程序之間生成不重複 值,最後一部分是一個自增的計數器, 前面三部分是為了保證同一秒在同一臺機器上的同一個程序上生成一個唯一的值,最後一部分用於保證在同一秒、同一臺機器、同一個程序 在同一秒內(注意是同一秒內)生成唯一值
  • mongodb中有一些特殊的鍵,它們被稱為修改器、操作符等
以 $ 開頭,如 
$set(更新欄位)、
$unset(刪除欄位)、 
$inc(自增或自減)、
$and$or$in$nin$nor$exists(用於判斷文件中是否包含某欄位)、
$push(向陣列中尾部新增一個元素)、
$pushAll(將陣列中的所有值push)、
$addToSet(向set集合中新增元素)、
$pop(刪除陣列中的頭部或尾部元素), 
$pull(刪除陣列中指定的值)、
$size(根據陣列的長度進行篩選)、
$slice(返回陣列中部分元素,如前幾個、後幾個、中間連續幾個元素)、
$elemMatch(用於匹配陣列中的多個條件)、
$where
(自定義篩選條件,效率比較低,需要將bson轉為js物件,不能使用索引,可以先使用普通查詢過濾掉部分不滿足條件的文件,然後再使用where,儘量減少where操作文件的數量過大)

MongoDB 與 關係型資料庫的對比:

  • MongoDB ———-> SQL
  • database資料庫 —->database資料庫
  • collection集合——->table表
  • document文件—-> row 行
  • filed欄位——-> column列
  • index索引—–> index索引
  • 不支援多表連線查詢—> 支援多表連線查詢
    在使用Shell中的方法時,注意很多方法都是有過載函式的

一:啟動服務和連線服務

1、mongod 用於啟動MongoDB服務

MongoDB的資料時儲存在磁碟上的,而不是儲存在記憶體中的,所以在啟動MongoDB服務時需要指定資料儲存的位置, 如果不指定會預設儲存在/data/db目錄下, 注意在使用預設位置時,需要以管理員身份預先建立好目錄

方式一: 使用預設的路徑,MongoDB安裝所在的碟符:/data/db

C:\Windows\system32>D:
D:\>mkdir data
D:\>cd data
D:\data>mkdir db
D:\data>cd D:\Java\MongoDB\Server\bin
D:\Java\MongoDB\Server\bin>mongod

MongoDB starting : pid=9712 port=27017 dbpath=D:\data\db\ 64-bit host=zm-PC

這裡寫圖片描述

方式二: 顯式指定資料庫路徑

此種方式也要預先建立好目錄,這裡的位置放置MongoDB裡面,如D:\Java\MongoDB\DB,放在MongoDB裡面不需要管理員身份建立
這裡寫圖片描述

方式三: 安裝服務

D:\Java\MongoDB\Server\bin>mongod  --dbpath=D:\data\db --logappend --logpath=D:\data\log.txt --install

這裡寫圖片描述

以後啟動服務只需要net start MongoDB, 比mongod --dbpath=xxx 稍微方便些, 以後電腦開機後就自動啟動了,省的每次都要啟動

這裡寫圖片描述

2、mongo 用於客戶端連線伺服器

語法: mongo [IP:PORT][/DATABASE_NAME]

IP預設的是127.0.0.1
Port預設的是27017
database預設的是test,mongodb中預設有兩個資料庫admin、local

D:\Java\MongoDB\Server\bin>mongo

這裡寫圖片描述

D:\Java\MongoDB\Server\bin>mongo 127.0.0.1:27017
D:\Java\MongoDB\Server\bin>mongo 127.0.0.1:27017/admin
// 連線時不指定要連線資料庫,需要時從連線中獲取需要的資料庫
D:\Java\MongoDB\Server\bin>mongo --nodb
MongoDB shell version v3.4.6
> db
2017-07-27T20:27:25.181+0800 E QUERY    [thread1] ReferenceError: db is not defined :
@(shell):1:1
> conn = new Mongo("localhost:27017")
connection to localhost:27017
> db = conn.getDB("test")
test
>

3. 基本命令

help命令:如果想知道某個物件下都有哪些函式可以使用help命令,直接使用help會列舉出mongodb支援操作,使用db.help()會列舉所有db物件所支援的所有操作,使用db.mycoll.help()可以列舉所有集合物件對應的操作

> help
        db.help()                    help on db methods
        db.mycoll.help()             help on collection methods
        sh.help()                    sharding helpers
        rs.help()                    replica set helpers
        help admin                   administrative help
        help connect                 connecting to a db help
        help keys                    key shortcuts
        help misc                    misc things to know
        help mr                      mapreduce

        show dbs                     show database names
        show collections             show collections in current database
        show users                   show users in current database
        show profile                 show most recent system.profile entries with time >= 1ms
        show logs                    show the accessible logger names
        show log [name]              prints out the last segment of log in memory, 'global' is default
        use <db_name>                set current database
        db.foo.find()                list objects in collection foo
        db.foo.find( { a : 1 } )     list objects in foo where a == 1
        it                           result of the last line evaluated; use to further iterate
        DBQuery.shellBatchSize = x   set default number of items to display on shell
        exit                         quit the mongo shell
// 檢視所有資料級別的操作
> db.help()
// 檢視集合級別的操作
> db.mycoll.help()
// 列舉資料庫命令
> db.listCommands()

檢視函式方法的實現或者檢視方法的定義(比如忘記函式的引數了)可以通過輸入函式名,不帶小括號

> db.foo.update
function (query, obj, upsert, multi) {
    var parsed = this._parseUpdate(query, obj, upsert, multi);
    ...
}
// 列印語句
> print("hello, mongodb")
hello, mongodb
>

// 執行js指令碼
D:\Java\MongoDB\Server\bin>mongo script1.js script2.js
loading file: script1.js
I am script1.js
loading file: script2.js
I am script2.js

// 使用load()函式載入指令碼來執行
> load("script1.js")
I am script1.js
true
// script3.js
print(db.getMongo().getDBs());    // show dbs
db.getSisterDB("foo");    // use foo
db.users.insert({"username": "mengday", "age": 26})
print(db.getCollectionNames());  // show collections

> load("script3.js")
[object BSON]
users
true
>
// 使用指令碼可以定義一些輔助的工具函式
tools.js
var connectTo = function (port, dbname) {
    if(!port) port = 27017;
    if(!dbname) dbname = "test";

    db = connect("localhost:" + port + "/" + dbname);

    return db;
}

> load("tools.js")
true
> typeof connectTo
function
> connectTo("27017", "admin")
connecting to: mongodb://localhost:27017/admin
MongoDB server version: 3.4.6
admin
>
客戶端啟動時自動執行js指令碼
在使用者的主目錄下(如C:\Users\mengday)下建立一個.mongorc.js檔案,該指令碼可以做一些操作,如重寫shell命令,禁掉一部分功能,如刪除資料庫,表等危險操作
// .mongorc.js
print("--------------MongoDB is started--------------");

var no = function(){
    print("not permission");
}

db.dropDatabase = DB.prototype.dropDatabase = no;
DBCollection.prototype = no;
DBCollection.prototype.dropIndex = no;

// 啟動shell時會自動執行
D:\Java\MongoDB\Server\bin>mongo
MongoDB shell version v3.4.6
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.6
----------------MongoDB is started-----------------
> db
test
> db.dropDatabase()
not permission
>
// mongo 啟動後給EDITOR變數賦值一個文字編輯器的位置,然後就可以使用edit命令來開啟編輯某個變量了,編輯後儲存,然後直接關掉編輯器即可,這對於一條命令或者變數比較長編輯比較方便,注意文字編輯器的位置不能包含空格,路徑要使用/,不能使用\
EDITOR="D:/SublimeText/sublime_text.exe"
var user = {"username": "mengday", "nickname": "xxx"};
edit user

// 方式二:可以將該配置放在.mongorc.js中,以後就不用每次設定了
EDITOR="D:/SublimeText/sublime_text.exe";

二:資料庫基本命令

這裡寫圖片描述

檢視當前資料庫 db
顯示所有資料庫 show dbs,如果資料庫裡沒有任何集合,是不展示出來的,如 use test2, show dbs 時是不包含test2資料庫的
切換或者新建資料庫 use DATABASE_NAME, 切換資料庫時如果資料庫不存在,則會建立它
刪除資料庫 db.dropDatabase()
顯示所有表(集合)show tables
檢視js方法的原型(原始碼實現): db.xxx.insert, 隨便寫一個集合名字,集合後面跟函式名,不需要函式的引數 即可檢視該函式的原始碼實現

// mong shell 是一種javascript shell, 可以定義變數、函式,呼叫函式
> x = 200
200
> x / 5
40
> Math.sin(Math.PI / 2)
1
// new Date():是建立一個日期物件,而Date()函式是返回日期字串,注意日期型別資料和字串資料不是一種資料,MongoDB Shell在操作日期欄位的時候是操作的日期型別而不是字串型別
> new Date()
ISODate("2017-07-27T00:18:34.370Z")
> Date()
Thu Jul 27 2017 08:18:37 GMT+0800
>
> "Hello, World!".replace("World", "MongoDB")
Hello, MongoDB!
> function factorial(n) {
... if(n <= 1) return 1;
... return n * factorial(n - 1);
... }
> factorial(5)
120
>

// db 是一個全域性變數,儲存當前的資料名稱,當切換資料庫時會自動更改db的值
> db
test
> show dbs
admin  0.000GB
local  0.000GB
> use local
switched to db local
> show tables
startup_log
> use test
switched to db test
> db.dropDatabase()
{ "ok" : 1 }
> db.xxx.insert

// 檢視一個bson的大小,每個文件最大不超過16M
> var user = {"username": "mengday"}
> Object.bsonsize(user)
27

集合操作

建立集合

方式一:隱式建立集合
當向集合中的插入文件時,如果集合不存在,系統會自動建立,所以向一個不存在的集合中插入資料也就是建立了集合

> db
test
> show tables
> db.users.insert({"usernmae": "mengdee", "age": 26})
WriteResult({ "nInserted" : 1 })
> show tables
users
>

方式二:顯示建立集合
db.createCollection(“集合名字”, 可選配置)
顯示建立集合可以通過一些配置建立一些特殊的集合,如固定集合

> show tables
users
> db.createCollection("address")
{ "ok" : 1 }

// 固定集合只能通過呼叫方法顯式建立,固定集合可以指定集合儲存資料的大小和最多允許儲存的條數
// 當固定集合文件條數達到上限時,再插入新的文件會將最老的文件刪除掉,然後插入到該位置
> db.createCollection("address", {capped: true, size: 10000, max:1000})
{ "ok" : 1 }
> show tables
address
users
>

刪除集合

db.集合名字.drop()

> db.address.drop()
true

檢視集合

show tables和show collections都可以檢視當前資料下的集合

> show tables
address
users
>
> show collections
address
users
>

新增資料


方式一: insert: _id 會自動建立唯一索引,當id重複的時候會報錯
db.集合名字.insert({})        // 插入一條,返回值中不包含insertedIds
db.集合名字.insert([{}, {}])  // 批量插入,返回值中不包含insertedIds
db.集合名字.insertOne(Bson)   // 插入一條,返回值返回插入的insertedId
db.集合名字.insertMany(Bson)  // 批量插入,返回值中包含insertedIds
db.集合名字.findAndModify({查詢條件}, "update": {需要新增或更新的欄位},  "upsert": true });

寫入安全:
    應答模式:插入時會返回成功或者失敗
    非應答模式:插入時沒有反饋,即插入有沒有成功不知道
> var user = {"name": "mengdee", "age": 20, "address": "上海市浦東新區張江鎮", "create_time": new Da
te()}
> db.users.insert(user)
WriteResult({ "nInserted" : 1 })
> db.users.find()
{ "_id" : ObjectId("5976ad21670af2aa52ea90df"), "username" : "mengdee", "age" : 26 }
{ "_id" : ObjectId("5976b395670af2aa52ea90e0"), "name" : "mengdee", "age" : 20, "address" : "上海市
浦東新區張江鎮", "create_time" : ISODate("2017-07-25T02:57:04.545Z") }

> var userDoc = db.users.findOne()
> var insertDate = userDoc["_id"]
> insertDate.getTimestamp()
ISODate("2017-07-25T02:29:53Z")
> insertDate.str
5976ad21670af2aa52ea90df

> db.users.insertOne({"username": "mengday3"})
{
        "acknowledged" : true,
        "insertedId" : ObjectId("5976b632670af2aa52ea90e1")
}
> db.users.insertMany([{"username": "mengday4"}, {"username": "mengday5"}])
{
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("5976b666670af2aa52ea90e2"),
                ObjectId("5976b666670af2aa52ea90e3")
        ]
}
> db.users.insert([{"username": "mengday6"}, {"username": "mengday7"}])
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 2,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})

// 使用insertOne插入重複的_id 會報錯
> db.users.insertOne({"_id": 1, "username": "mengday8"})
{ "acknowledged" : true, "insertedId" : 1 }
> db.users.insertOne({"_id": 1, "username": "mengday8"})
2017-07-25T11:15:47.822+0800 E QUERY    [thread1] WriteError: E11000 duplicate key error collection:
 test.users index: _id_ dup key: { : 1.0 } :
WriteError({
        "index" : 0,
        "code" : 11000,
        "errmsg" : "E11000 duplicate key error collection: test.users index: _id_ dup key: { : 1.0 }
",
        "op" : {
                "_id" : 1,
                "username" : "mengday8"
        }
})

// findAndModify 也可以用於插入文件,但是前提是一定不存在,如果存在了就變成更新了,單純的插入還是不要用種方式了,findAndModify一般用於更新或刪除操作
> db.users.findAndModify({ "query": {"username": "mengday11"}, "update": {"username": "mengday11", "age": 26},  "upsert": true })
null
> db.users.find()
{ "_id" : ObjectId("597c584448c373e228a9259e"), "username" : "xxx", "age" : 26 }

MongoDB Shell是一種JS,所以可以通過var來定義變數,可以通過find()方法來查詢集合中的所有資料,相當於select * from users
插入資料時,如果沒有指定_id這個欄位,系統會自動生成一個值,從該值中能夠解析出插入文件的日期或者獲取日期中的字串值

方式二:save()
db.集合名字.save(Bson) : 如果要插入的文件沒有指定_id,則插入文件,如果指定_id,如果集合中不包含_id,則插入文件,如果集合中已經存在相同的id值,則更會整體替換

> db.users.find()
{ "_id" : 1, "username" : "mengday8" }
{ "_id" : 2, "username" : "mengday8" }
> db.users.save({ "_id" : 3, "mengday9" : 20})
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 3 })
> db.users.save({ "_id" : 2, "age" : 20, "gender": 1 })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find()
{ "_id" : 1, "username" : "mengday8" }
{ "_id" : 2, "age" : 20, "gender" : 1 }
{ "_id" : 3, "mengday9" : 20 }
>
> db.users.save([{ "_id" : 4, "username": "mengday9"}, { "_id" : 5, "username":"mengday10"}])

方式三: update()
update({查詢條件}, {更新的文件}, 是否開啟addOrUpdate) : addOrUpdate為true,當集合中不存在的時候就插入,存在就更新

> db.users.find()
{ "_id" : 5, "username" : "mengday10" }
> db.users.update({"username" : "mengday11"}, { "_id" : 6, "age" : 20, "gender" : 1 }, true)
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 6 })
> db.users.find()
{ "_id" : 5, "username" : "mengday10" }
{ "_id" : 6, "age" : 20, "gender" : 1 }
>

刪除 remove

remove({刪除條件}): 刪除滿足條件的所有資料
remove({刪除條件}, true): 刪除滿足條件的第一條資料
remove({}): 清空集合中的所有文件

// 刪除bson變數中的某個欄位
> var user = {"username": "mengday", "age": 26}
> delete user.age
> user
{ "username" : "mengday" }


> db.users.find()
{ "_id" : 1, "username" : "mengday", "password" : "123456" }
{ "_id" : 2, "username" : "mengday2", "password" : "123456" }
{ "_id" : 3, "username" : "mengday3", "password" : "123456", "age" : 18 }
{ "_id" : 4, "username" : "mengday4", "password" : "123456", "age" : 28 }
{ "_id" : 5, "username" : "mengday5", "password" : "123456", "age" : 38 }
> db.users.remove({age: {$lt: 38}})
WriteResult({ "nRemoved" : 2 })
> db.users.find()
{ "_id" : 1, "username" : "mengday", "password" : "123456" }
{ "_id" : 2, "username" : "mengday2", "password" : "123456" }
{ "_id" : 5, "username" : "mengday5", "password" : "123456", "age" : 38 }
> db.users.remove({"password": "123456"}, true)
WriteResult({ "nRemoved" : 1 })
> db.users.find()
{ "_id" : 2, "username" : "mengday2", "password" : "123456" }
{ "_id" : 5, "username" : "mengday5", "password" : "123456", "age" : 38 }
> db.users.remove({})
WriteResult({ "nRemoved" : 2 })

// findAndModify可以用來插入或更新upsert、也可以用來刪除
> db.users.findAndModify({
   "query": {"username": "mengday"},
   "remove": true
})
{
        "_id" : ObjectId("597c3c1587d089dfa7ce1be3"),
        "username" : "mengday",
        "addresses" : [
                {
                        "city" : "shanghai",
                        "area" : "zhangjiang"
                },
                {
                        "city" : "beijing",
                        "area" : "CHAOYANG"
                }
        ],
        "create_time" : ISODate("2017-07-29T09:09:14.031Z")
}

更新 update,findAndModify

更新指定欄位的值
替換整個文件
更新滿足條件的第一條文件
更新滿足條件的所有文件

> db.users.find()
{ "_id" : 1, "username" : "mengday5", "password" : "123456", "age" : 38 }
// 使用$set修改器修改指定欄位, 當欄位不存在時會建立並賦值
> db.users.update({"username": "mengday5"}, {$set: {"age": 18}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find()
{ "_id" : 1, "username" : "mengday5", "password" : "123456", "age" : 18 }

// $unset 用於刪除欄位
> db.users.update({"username": "mengday5"}, {"$unset": {"age": 1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find()
{ "_id" : 1, "username" : "mengday5", "password" : "123456" }

> db.users.find()
{ "_id" : 1, "username" : "mengday5", "password" : "123456" }

// $push: 向陣列的尾部新增一個元素,如果欄位不存在則建立
> db.users.update({"username": "mengday5"}, {"$push": {"hobby": "mm"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find()
{ "_id" : 1, "username" : "mengday5", "password" : "123456", "hobby" : [ "mm" ] }
> db.users.update({"username": "mengday5"}, {"$push": {"hobby": "money"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find()
{ "_id" : 1, "username" : "mengday5", "password" : "123456", "hobby" : [ "mm", "money" ] }
>

// $push + $each : 批量push
> db.users.update({"username": "mengday5"}, {"$push": {"hobby": {"$each": ["play", "eat"]}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find()
{ "_id" : 1, "username" : "mengday5", "password" : "123456", "hobby" : [ "mm", "money", "play", "eat" ] }
>

// $pushAll = $push + $each 批量push
> db.users.update({"username": "mengday5"}, {"$pushAll": {"hobby": ["drink", "happy"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find()
{ "_id" : 1, "username" : "mengday5", "password" : "123456", "hobby" : [ "mm", "money", "play", "eat", "drink", "happy" ] }


> db.users.find()
{ "_id" : 1, "username" : "mengday5", "password" : "123456" }

// $addToSet:不重複的set集合
> db.users.update({}, {"$addToSet": {"hobby": "eat"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find()
{ "_id" : 1, "username" : "mengday5", "password" : "123456", "hobby" : [ "eat" ] }
>
> db.users.update({}, {"$addToSet": {"hobby": {"$each": ["eat", "drink"]}}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find()
{ "_id" : 1, "username" : "mengday5", "password" : "123456", "hobby" : [ "eat", "drink" ] }
>

// $pop: 彈出陣列的頭部元素或尾部元素: -1:頭部,1:尾部
> db.users.update({}, {"$pop": {"hobby": 1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find()
{ "_id" : 1, "username" : "mengday5", "password" : "123456", "hobby" : [ "eat" ] }

// $pull: 刪除陣列中的值
> db.lists.insert({"no": [1, 1, 1, 3]})
WriteResult({ "nInserted" : 1 })
> db.lists.update({}, {"$pull": {"no": 1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.lists.find()
{ "_id" : ObjectId("597c0a3087d089dfa7ce1be2"), "no" : [ 3 ] }
>

// 使用小標或者定位操作符$來運算元組
> db.users.find()
{ "_id" : ObjectId("597c3c1587d089dfa7ce1be3"), "username" : "mengday", "addresses" : [ { "city" : "shanghai", "area" : "zhangjiang" }, { "city" : "be
ijing", "area" : "chaoyang" } ] }
>
// 修改內嵌文件陣列中第二個元素的值
> db.users.update({"username": "mengday"}, {"$set": {"addresses.1.area": "chaoyangqu"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.findOne()
{
        "_id" : ObjectId("597c3c1587d089dfa7ce1be3"),
        "username" : "mengday",
        "addresses" : [
                {
                        "city" : "shanghai",
                        "area" : "zhangjiang"
                },
                {
                        "city" : "beijing",
                        "area" : "chaoyangqu"
                }
        ]
}

// 定位操作符$: 查詢條件一般是以陣列中的元素為條件,使用$符號作為滿足查詢條件的第一條文件對應的下標值
> db.users.update({"addresses.city": "beijing"}, {"$set": {"addresses.$.area": "CHAOYANG"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.findOne()
{
        "_id" : ObjectId("597c3c1587d089dfa7ce1be3"),
        "username" : "mengday",
        "addresses" : [
                {
                        "city" : "shanghai",
                        "area" : "zhangjiang"
                },
                {
                        "city" : "beijing",
                        "area" : "CHAOYANG"
                }
        ]
}


// 文件整體替換
> db.users.update({"username": "mengday5"}, {"age": 17})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find()
{ "_id" : 1, "age" : 17 }

// 第三個引數: 插入或者更新,當_id不存在的時候插入,當_id值存在的時候更新
> db.users.update({"_id": 2}, {"username": "mengday", "age": 16}, true)
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 2 })
> db.users.find()
{ "_id" : 1, "age" : 17 }
{ "_id" : 2, "username" : "mengday", "age" : 16 }

// 更新
> db.users.update({"_id": 2}, {"username": "mengday2", "birthday": new Date()}, true)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find()
{ "_id" : 1, "age" : 17 }
{ "_id" : 2, "username" : "mengday2", "birthday" : ISODate("2017-07-25T06:33:10.579Z") }

> db.users.find()
{ "_id" : 1, "username" : "mengday", "age" : 16 }
{ "_id" : 2, "username" : "mengday2", "age" : 16 }

// 更新滿足條件的第一條文件
> db.users.update({"age": 16}, {$set: {"age": 18}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.users.find()
{ "_id" : 1, "username" : "mengday", "age" : 18 }
{ "_id" : 2, "username" : "mengday2", "age" : 16 }

// 第三個引數:insertOrUpdate, 第四個引數:是否批量更新,true就是更新所有滿足條件的文件
> db.users.update({"age": {$gte: 16