MongoDB 使用手冊

MongoDB

常用命令:

  • show dbs 顯示所有的資料庫
  • use 資料庫名 切換到某一個數據中
  • show collections 顯示當前資料庫中所有的集合
  • db.集合名.find() 查詢當前資料庫中某一個集合下所有的數據
  • db.集合名.insert({“鍵”: “值”, “鍵”: “值” …}) 給當前資料庫中某一個集合添加數據
  • db.集合名.drop() 刪除某一個集合
  • db.dropDatabase() 刪除當前資料庫
> use zyhtest
switched to db zyhtest
> db.student.insert({"name": "zhangsan", "age": 28})
WriteResult({ "nInserted" : 1 })
> show dbs
local    0.000GB
zyhtest  0.000GB
> show collections
student
> db.student.find()
{ "_id" : ObjectId("5745b8a08dfa492b66e7d397"), "name" : "zhangsan", "age" : 28 }
> db.student.drop()
true
> show dbs
local    0.000GB
> db.student.insert({"name": "zhangsan", "age": 28})
WriteResult({ "nInserted" : 1 })
> show dbs
local    0.000GB
zyhtest  0.000GB
> show collections
student
> db.dropDatabase()
{ "dropped" : "zyhtest", "ok" : 1 }
> show dbs
local    0.000GB

文檔插入操作

  1. 文檔的數據存儲格式為BSON,類似於JSON。MongoDB插入數據時會檢驗數據中是否有「_id」,如果沒有會自動生成。
    shell操作有insert和save兩種方法。當插入一條數據有「_id」值,並且現在集合中已經有相同的值,使用insert插入時插入不進去,使用save時,會更新數據。

    > db.student.drop()
    true
    > db.student.insert({"_id": 1, "name":"zhangsan", "age": 28})
    WriteResult({ "nInserted" : 1 })
    > db.student.find()
    { "_id" : 1, "name" : "zhangsan", "age" : 28 }
    > db.student.insert({"_id": 1, "name":"zhangsan", "age": 27})
    WriteResult({
            "nInserted" : 0,
            "writeError" : {
                    "code" : 11000,
                    "errmsg" : "E11000 duplicate key error collection: zyhdb.student index: _id_ dup key: { : 1.0 }"
            }
    })
    > db.student.find()
    { "_id" : 1, "name" : "zhangsan", "age" : 28 }
    > db.student.save({"_id": 1, "name":"zhangsan", "age": 27})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.student.find()
    { "_id" : 1, "name" : "zhangsan", "age" : 27 }
    
  2. 批量插入

    > db.student.insert([{"_id": 2, "name": "lisi"},{"_id": 3, "name": "wangwu"}, {"_id": 4, "name": "zhaoliu", "age": 28}])
    BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 3,
    "nUpserted" : 0,
    "nMatched" : 0,
    "nModified" : 0,
    "nRemoved" : 0,
    "upserted" : [ ]
    })
    > db.student.find()
    { "_id" : 1, "name" : "zhangsan", "age" : 27 }
    { "_id" : 2, "name" : "lisi" }
    { "_id" : 3, "name" : "wangwu" }
    { "_id" : 4, "name" : "zhaoliu", "age" : 28 }
    
  3. 循環插入

    > for(var i=0; i<10; i++){db.fortest.insert({num: i})}
    WriteResult({ "nInserted" : 1 })
    > db.fortest.find()
    { "_id" : ObjectId("57469e80142cea1d9aeabab5"), "num" : 0 }
    { "_id" : ObjectId("57469e80142cea1d9aeabab6"), "num" : 1 }
    { "_id" : ObjectId("57469e80142cea1d9aeabab7"), "num" : 2 }
    { "_id" : ObjectId("57469e80142cea1d9aeabab8"), "num" : 3 }
    { "_id" : ObjectId("57469e80142cea1d9aeabab9"), "num" : 4 }
    { "_id" : ObjectId("57469e80142cea1d9aeababa"), "num" : 5 }
    { "_id" : ObjectId("57469e80142cea1d9aeababb"), "num" : 6 }
    { "_id" : ObjectId("57469e80142cea1d9aeababc"), "num" : 7 }
    { "_id" : ObjectId("57469e80142cea1d9aeababd"), "num" : 8 }
    { "_id" : ObjectId("57469e80142cea1d9aeababe"), "num" : 9 }
    

查詢操作

先把student刪除,再重新插入數據

> db.student.drop()
true
> db.student.insert([{ "_id" : 1, "name" : "zhangsan", "age": 27, "sex": 1 }, { "_id" : 2, "name" : "lisi", "age": 27 } ,{ "_id" : 3, "name" : "wangwu", "age": 30 }, { "_id" : 4, "name" : "zhaoliu", "age": 28 }, { "_id" : 5, "name" : "qianliu", "age": 33 }, { "_id" : 6, "name" : "sunba", "age": 32 }])
BulkWriteResult({
        "writeErrors" : [ ],
        "writeConcernErrors" : [ ],
        "nInserted" : 6,
        "nUpserted" : 0,
        "nMatched" : 0,
        "nModified" : 0,
        "nRemoved" : 0,
        "upserted" : [ ]
})
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 27 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }

查詢指定鍵

> db.student.find({},{name:1})
{ "_id" : 1, "name" : "zhangsan" }
{ "_id" : 2, "name" : "lisi" }
{ "_id" : 3, "name" : "wangwu" }
{ "_id" : 4, "name" : "zhaoliu" }
{ "_id" : 5, "name" : "qianliu" }
{ "_id" : 6, "name" : "sunba" }
> db.student.find({},{_id:0, age:0})
{ "name" : "zhangsan", "sex" : 1 }
{ "name" : "lisi" }
{ "name" : "wangwu" }
{ "name" : "zhaoliu" }
{ "name" : "qianliu" }
{ "name" : "sunba" }
> db.student.find({},{_id:0, name:1})
{ "name" : "zhangsan" }
{ "name" : "lisi" }
{ "name" : "wangwu" }
{ "name" : "zhaoliu" }
{ "name" : "qianliu" }
{ "name" : "sunba" }

各種查詢方式

$lt:<
$lte:<=
$gt:>
$gte:>=
$ne:!=

> db.student.find({age:{$lt:30}})
{ "_id" : 1, "name" : "zhangsan", "age" : 27, "sex" : 1 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
> db.student.find({age:{$ne:27}})
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }

$in:包含
$nin:不包含

> db.student.find({age:{$in:[27,28]}})
{ "_id" : 1, "name" : "zhangsan", "age" : 27, "sex" : 1 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
> db.student.find({age:{$nin:[27,28]}})
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }

$or:或者

> db.student.find({$or:[{age:{$lt:29}}, {name:"sunba"}]})
{ "_id" : 1, "name" : "zhangsan", "age" : 27, "sex" : 1 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }

null:空值

> db.student.find({sex: null})
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }

$type:鍵是某種類型的
double:1
string:2

> db.student.insert({_id:7, name:7, age:70})
WriteResult({ "nInserted" : 1 })
> db.student.find({name: {$type: 2}})
{ "_id" : 1, "name" : "zhangsan", "age" : 27, "sex" : 1 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
> db.student.find({name: {$type: 1}})
{ "_id" : 7, "name" : 7, "age" : 70 }

正則表達式

> db.student.find({name: /si\b/})
{ "_id" : 2, "name" : "lisi", "age" : 27 }

db.集合名稱.findOne({查詢條件},{指定鍵})
查詢出符合條件的第一條數據

> db.student.findOne()
{ "_id" : 1, "name" : "zhangsan", "age" : 27, "sex" : 1 }

db.集合名稱.find({查詢條件},{指定鍵}).limit(數字)
查詢前幾條數據

> db.student.find().limit(3)
{ "_id" : 1, "name" : "zhangsan", "age" : 27, "sex" : 1 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }

db.集合名稱.find({查詢條件},{指定鍵}).skip(數字)
跳過前幾條數據

> db.student.find().skip(2)
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 7, "name" : 7, "age" : 70 }

可以使用limit()和skip()實現分頁

> db.student.find().skip(0).limit(3)
{ "_id" : 1, "name" : "zhangsan", "age" : 27, "sex" : 1 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
> db.student.find().skip(3).limit(3)
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
> db.student.find().skip(6).limit(3)
{ "_id" : 7, "name" : 7, "age" : 70 }

db.集合名稱.find().sort({鍵:數字})
數字為1表示升序,數字為2表示降序

> db.student.find().sort({age:1})
{ "_id" : 1, "name" : "zhangsan", "age" : 27, "sex" : 1 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 7, "name" : 7, "age" : 70 }
> db.student.find().sort({age:1, _id:-1})
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 1, "name" : "zhangsan", "age" : 27, "sex" : 1 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 7, "name" : 7, "age" : 70 }

文檔修改操作

db.集合名稱.update({query},{update},upsert, multi})
query:過濾條件
update:修改內容
upsert:如果不存在查詢條件查出的記錄,是否插入一條數據,默認是false
multi:是否只修改查詢條件查出的第一條記錄,默認是false

> db.student.update({_id:1}, {name:"zhang"})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : 1, "name" : "zhang" }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }

把整條數據都修改了,如果修改內容中沒有設置age欄位,則以前的age也取消了,數據全部修改

局部修改

$set:如果存在鍵則修改,如果不存在鍵則添加

> db.student.update({_id: 1},{$set:{name:"zhangsan", age: 26}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }

id重複時無法修改

> db.student.update({_id:1},{_id:0, name:"zhangsanzhangsan"})
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 16837,
"errmsg" : "The _id field cannot be changed from {_id: 1.0} to {_id: 0.0}."
}
})
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }

第三個參數默認為false,如果查不到數據false時不執行任何操作,true時往資料庫里新插入一條數據

> db.student.update({_id:7},{_id:7, name: "songjiu", age:32})
WriteResult({ "nMatched" : 0, "nUpserted" : 0, "nModified" : 0 })
> db.student.update({_id:7},{_id:7, name: "songjiu"}, true)
WriteResult({ "nMatched" : 0, "nUpserted" : 1, "nModified" : 0, "_id" : 7 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 7, "name" : "songjiu", "age" : 32 }

第四個參數默認為false,false時表示只修改查詢到的第一條數據,true時表示修改查詢到的所有數據

> db.student.update({age:32}, {$set:{age:33}}, false, false)
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 33 }
{ "_id" : 7, "name" : "songjiu", "age" : 32 }
> db.student.update({age:33}, {$set:{age:32}}, false, true)
WriteResult({ "nMatched" : 2, "nUpserted" : 0, "nModified" : 2 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 32 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 7, "name" : "songjiu", "age" : 32 }
> db.student.update({age:32}, {$set:{age:33}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 7, "name" : "songjiu", "age" : 32 }

$inc:在原來的基礎上加多少

> db.student.update({_id:7}, {$inc:{age:-1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 7, "name" : "songjiu", "age" : 31 }

$unset:去掉某個鍵

> db.student.update({_id:7},{$unset:{age:1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 7, "name" : "songjiu" }

針對數組類型的操作

$push:當數據中不存在鍵時,創建數組類型的鍵並插入該值;如果存在該鍵,並且該鍵是數組類型時,則在此數組類型的數據上追加;如果存在該鍵,並且該鍵不是數組類型時,會報錯。
$pushAll:批量往數組中追加
$addToSet:數組中有該值時不追加,沒有該值時追加

> db.student.update({_id: 7},{$push:{skill:"java"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 7, "name" : "songjiu", "skill" : [ "java" ] }
> db.student.update({_id: 7},{$push:{skill:"mongodb"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 7, "name" : "songjiu", "skill" : [ "java", "mongodb" ] }
> db.student.update({_id: 7},{$push:{name:"111"}})
WriteResult({
"nMatched" : 0,
"nUpserted" : 0,
"nModified" : 0,
"writeError" : {
"code" : 16837,
"errmsg" : "The field 'name' must be an array but is of type String in document {_id: 7.0}"
}
})
> db.student.update({_id: 7},{$pushAll:{skill:["js","C++","java"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 7, "name" : "songjiu", "skill" : [ "java", "mongodb", "js", "C++", "java" ] }
> db.student.update({_id:7},{$addToSet:{skill:"mongodb"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 7, "name" : "songjiu", "skill" : [ "java", "mongodb", "js", "C++", "java" ] }

$pop:刪除數組的第一個或最後一個元素,值為-1時是刪除第一個元素,值為1時是刪除最後一個元素。
$pull:刪除數組中的某一個指定的數值
$pullAll:刪除數組中多個指定的數值

> db.student.update({_id:7},{$pop:{skill:1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 7, "name" : "songjiu", "skill" : [ "java", "mongodb", "js", "C++" ] }
> db.student.update({_id:7},{$pop:{skill:-1}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 7, "name" : "songjiu", "skill" : [ "mongodb", "js", "C++" ] }
> db.student.update({_id:7},{$pull:{skill:"js"}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 7, "name" : "songjiu", "skill" : [ "mongodb", "C++" ] }
> db.student.update({_id:7},{$pullAll:{skill:["js"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 0 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 7, "name" : "songjiu", "skill" : [ "mongodb", "C++" ] }
> db.student.update({_id:7},{$pullAll:{skill:["mongodb","C++"]}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.student.find()
{ "_id" : 1, "name" : "zhangsan", "age" : 26 }
{ "_id" : 2, "name" : "lisi", "age" : 27 }
{ "_id" : 3, "name" : "wangwu", "age" : 30 }
{ "_id" : 4, "name" : "zhaoliu", "age" : 28 }
{ "_id" : 5, "name" : "qianliu", "age" : 33 }
{ "_id" : 6, "name" : "sunba", "age" : 32 }
{ "_id" : 7, "name" : "songjiu", "skill" : [ ] }

用戶管理操作

1、修改啟動MongoDB時要求用戶驗證
加參數 –auth 即可。
現在我們把MongoDB服務刪除,再重新添加服務

mongod --dbpath "D:\work\MongoDB\data" --logpath "D:\work\MongoDB\log\mongodb.log" --install --serviceName "MongoDB" --auth

2、創建用戶,並使用創建的用戶登錄
打開shell操作介面,默認test數據,再查看所有資料庫,發現報錯,因為沒有用戶驗證。
使用db.auth(“user”,”pwd”)進行用戶驗證。
user:用戶名
pwd:密碼

因為資料庫中沒有用戶,所以需要先使用無用戶驗證的方式啟動數據,在admin資料庫下新建用戶。
db.createUser({user:””, pwd:””, roles:[{role:””, db:””}]})
在當前資料庫下創建一個用戶
user:用戶名
pwd:密碼
roles:角色資訊
[role:角色名, db:對指定資料庫的操作]

> db.createUser({user:"admin", pwd:"admin", roles:[{role:"userAdminAnyDatabase", db:"admin"}]})
Successfully added user: {
"user" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}

在使用用戶驗證的方式啟動資料庫,在資料庫admin中,使用admin登錄

\> db.auth("admin","admin")
1

狀態1表示驗證成功,0表示驗證失敗

創建用戶默認給當前使用的數據下創建用戶,
例如:當前使用的數據是admin,在admin數據下新建用戶
db.createUser({user:”zyh”, pwd:”zyh”, roles:[{role:”readWrite”, db:”zyhdb”}]})
在admin資料庫下使用zyh登錄,可讀寫zyhdb的collection。
當在zyhdb下,無法使用zyh登錄,因為用戶zyh是在admin資料庫下。

3、查看當前數據下的用戶
show users 顯示當前資料庫下所有的用戶
使用有用戶管理許可權的用戶登錄才能看見,例如使用zyh登錄後,執行會報錯;使用admin登錄後,顯示用戶

> db.auth("zyh","zyh")
1
> show users
2016-06-01T20:32:30.639+0800 E QUERY [thread1] Error: not authorized on admin to execute command { usersInfo: 1.0 } :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.getUsers@src/mongo/shell/db.js:1523:1
shellHelper.show@src/mongo/shell/utils.js:743:9
shellHelper@src/mongo/shell/utils.js:650:15
@(shellhelp2):1:1

> db.auth("admin","admin")
1
> show users
{
"_id" : "admin.admin",
"user" : "admin",
"db" : "admin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
{
"_id" : "admin.zyh",
"user" : "zyh",
"db" : "admin",
"roles" : [
{
"role" : "readWrite",
"db" : "zyhdb"
}
]
}

還可以使用db.getUsers()查看所有的用戶
使用db.getUser(“user”)查詢指定用戶的具體資訊

4、修改用戶資訊
db.changeUserPassword(“user”, “newpwd”),修改密碼
user:用戶名
newpwd:新的密碼

db.updateUser(“user”, {roles:[{role:””, db:””}]})
修改用戶資訊

db.grantRolesToUser(“user”, [{role:””, db:””}])
追加角色

db.revokeRolesFromUser(“user”, [{role:””, db:””}])
取消角色

5、刪除用戶
db.dropUser(“user”) 刪除指定用戶

db.dropAllUsers() 刪除當前數據下所有用戶

附:常用內置角色說明
資料庫用戶角色(每個資料庫都有的角色)
read 對non-system集合的讀取許可權,以及以下system集合的讀取許可權:system.indexes,system.js,system.namespaces
readWrite 對non-system集合的讀寫許可權,以及system.js上的讀寫許可權

資料庫管理角色(每個資料庫都包含的數據管理角色)
dbAdmin 完成管理性任務的許可權,比如schema相關任務、索引、統計資訊收集。不能用於管理用戶和角色
dbOwner 管理資料庫需要的所有許可權。包含(readWrite、dbAdmin、userAdmin角色的許可權)
userAdmin 在當前資料庫創建和修改角色和用戶的許可權

集群管理角色
admin資料庫包含以下角色用於管理整個系統,而不是只針對單個資料庫
clusterAmin 提供集群管理的最大許可權。包含了clusterManager、clusterMonitor、hostManager角色的許可權
clusterManager 管理和監控集群,可以訪問local和config資料庫。
clusterMonitor 對集群的讀許可權
hostManager 管理和健康servers

備份和還原角色
admin資料庫包含以下角色用於備份和還原數據
backup 備份許可權
restore 還原許可權

all-database roles
admin數據提供以下角色,對所有資料庫都有效。
readAnyDatabase 提供對所有資料庫的讀許可權
readWriteAnyDatabase 提供對所有資料庫的寫許可權
userAdminAnyDatabase 提供對所有資料庫用戶的管理許可權
dbAdminAnyDatabase 對所有資料庫的dbAdmin許可權

超級角色
角色 說明
root 擁有最高許可權

另外角色也可以自定義設置。

java 操作API

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;

import org.bson.Document;

import com.mongodb.MongoClient;
import com.mongodb.MongoCredential;
import com.mongodb.ServerAddress;
import com.mongodb.client.FindIterable;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;

public class MongoZyh {

    public static void main(String[] args) {

        try {
            // 連接到MongoDB服務,ServerAddress()兩個參數分別為 伺服器地址 和 埠
            ServerAddress serverAddress = new ServerAddress("localhost", 27017);
            List<ServerAddress> addrs = new ArrayList<ServerAddress>();
            addrs.add(serverAddress);

            // 三個參數分別為 用戶名 資料庫名稱 密碼
            MongoCredential credential = MongoCredential
                    .createScramSha1Credential("zyh", "admin",
                            "zyh".toCharArray());
            List<MongoCredential> credentials = new ArrayList<MongoCredential>();
            credentials.add(credential);

            // 通過連接認證獲取MongoDB連接
            MongoClient mongoClient = new MongoClient(addrs, credentials);

            // 連接到資料庫
            MongoDatabase mongoDatabase = mongoClient.getDatabase("zyhdb");

            // 新建集合,執行後會在資料庫里新建一個空的集合
            // mongoDatabase.createCollection("student");
            // System.out.println("新建集合成功");

            // 獲取集合,並往集合中插入數據
            MongoCollection<Document> mongoCollection = mongoDatabase
                    .getCollection("student");

            // 插入一條數據
            // Document document = new Document();
            // document.append("name", "zhangsan");
            // document.append("age", 28);
            // mongoCollection.insertOne(document);
            // System.out.println("插入一條數據成功");

            // 插入多條數據
            // List<Document> documentList = new ArrayList<Document>();
            // Document document1 = new Document();
            // document1.append("name", "lisi");
            // document1.append("age", 28);
            // document1.append("sex", "男");
            // Document document2 = new Document();
            // document2.append("name", "wangwu");
            // document2.append("age", 31);
            // document2.append("sex", "男");
            // documentList.add(document1);
            // documentList.add(document2);
            // mongoCollection.insertMany(documentList);
            // System.out.println("插入多條數據成功");

            // 查詢數據
            // 查詢集合中所有的數據
            // FindIterable<Document> findIterable = mongoCollection.find();
            // MongoCursor<Document> mongoCursor = findIterable.iterator();
            // while (mongoCursor.hasNext()) {
            // System.out.println(mongoCursor.next());
            // }

            // 根據條件查詢
            // Document query = new Document();
            // query.put("age", new Document("$lt", 30));
            // query.put("sex", "男");
            // query.put("name", query);

            // 正則表達式查詢
            // Pattern pattern = Pattern.compile("^zhang");
            // query.put("name", pattern);

            // 排序
            // Document sort = new Document();
            // sort.put("name", -1); // 1是正序,-1是倒序

            // FindIterable<Document> findIterable = mongoCollection.find(query)
            // .sort(sort);
            // MongoCursor<Document> mongoCursor = findIterable.iterator();
            // while (mongoCursor.hasNext()) {
            // Document doc = mongoCursor.next();
            // System.out.print("name:" + doc.get("name") + "...");
            // System.out.print("age:" + doc.get("age") + "...");
            // System.out.println("sex:" + doc.get("sex") + "...");
            // }

            // mongoCollection.findOneAndUpdate(查詢條件, 修改內容); // 查詢出第一條數據並修改
            // mongoCollection.findOneAndDelete(查詢條件); // 查詢出第一條數據並刪除
            // mongoCollection.findOneAndReplace(查詢條件, 替換內容); // 查詢出第一條數據並替換

            // 修改數據
            // Document query = new Document();
            // query.put("age", 28);
            // Document update = new Document();
            // Document d = new Document();
            // d.put("birthday", new Date());
            // d.put("name", "zhangsan");
            // update.put("$set", d);
            // mongoCollection.updateOne(query, update); // 修改查詢到的第一條數據
            // mongoCollection.updateMany(查詢條件, 修改內容);// 修改查詢到的所有數據

            // 刪除數據
            // Document query = new Document();
            // query.put("age", 28);
            // mongoCollection.deleteOne(query); // 刪除查詢到的第一條數據
            // mongoCollection.deleteMany(查詢條件); // 刪除查詢到的所有數據

            // mongoCollection.drop(); // 刪除集合

        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}