標籤:
串連mongodb:
mongo 192.168.18.xx:27088/ups -uusername -ppassword --mongo命令開啟的是一個javascript shell。所以js文法在這裡面都行得通
協助:
help
db.help()
db.mycoll.help()
切換或建立資料庫:
use testdb
建立集合:
db.createCollection("mycollection") --看增加選項參數指定集合選項
使用者等基本資料查詢:
db.addUser(‘name‘,‘pwd‘) --增加或修改使用者密碼
db.system.users.find() --查看使用者列表
db.auth(‘name‘,‘pwd‘) --使用者認證
db.removeUser(‘name‘) --刪除使用者
show users --查看所有使用者
show dbs --查看所有資料庫
show collections --查看所有的collection
db.printCollectionStats() --查看各collection的狀態
db.copyDatabase(‘mail_addr‘,‘mail_addr_tmp‘) --拷貝資料庫
db.mail_addr.drop() --刪除collection
db.dropDatabase() --刪除當前的資料庫
插入:
db.mycollection.insert({"a":"s","sd":2}) --“_id": 這個欄位是資料庫預設給我們加的GUID,目的就是保證資料的唯一性
或:db.mycollection.save({"a":"s","sd":2})
var data={"name":"limin", "age":22, "address":"shenzhen"}
db.mycollection.insert(data)
db.mycollection.find()
data.name="yyy"
db.mycollection.insert(data)
db.foo.save({‘name‘:‘ysz‘,‘address‘:{‘city‘:‘beijing‘,‘post‘:100096},‘phone‘:[138,139]}) --儲存嵌套的對象
db.user_addr.save({‘Uid‘:‘[email protected]‘,‘Al‘:[‘[email protected]‘,‘[email protected]‘]}) --儲存數組對象
刪除:
db.mycollection.remove({}) --刪除mycollection中所有資料
db.mycollection.remove({"name":"eee"}) --刪除滿足條件的所有資料
更新:
db.mycollection.update({"name":"www"}, {"name":"eee"}) --update方法的第一個參數為“尋找的條件”,第二個參數為“更新的值” 屬於整體更新(但只更新一條)
db.mycollection.update({"name":"www"}, {$inc:{"age":10}}) --局部更新,age增加10
db.mycollection.update({"name":"www"}, {$set:{"age":10}}) --局部更新,age變更為10
db.mycollection.update({"name":"www"}, {"name":"eee"},true)
db.mycollection.update({"name":"www"}, {"name":"eee"},upsert=true) --upsert操作(將update的第三個參數設為true即可),更新時如果根據條件沒有查到,就在資料庫裡面新增一條
db.mycollection.update({"age":22}, {$set:{"age":32}},upsert=true,multi=true) --批次更新(在update的第四個參數中設為true即可), 滿足條件的都更新
查詢:
db.mycollection.find() 或 db.mycollection.find({}) --查詢所有
db.mycollection.find({"age":22}) --查詢age為22的
db.mycollection.findOne({"name":"www"}) --查出一條資料
db.mycollection.find({}).limit(2) --限制查詢的資料條數
db.users.find().skip(3).limit(5) --從第3條(0開始的)記錄開始,返回5條記錄
$where查詢:
db.testy.find({"$where":function(){return this.age==22}})
或:db.testy.find({"$where":"this.age==22"}) --採用$where子句查詢在速度上較常規查詢慢的多。因文檔需要從BSON轉換成javascript對象,然後通過"$where"的運算式來運行
關係查詢:
"$gt", "$gte", "$lt", "$lte", "$ne", "沒有特殊關鍵字" (>, >=, <, <=, !=, =):
db.mycollection.find({"age":{$lt:22}})
"無關鍵字“, "$or", "$in","$nin"(And,OR,In,NotIn):
db.mycollection.find({"age":22, "name":"www"}) --and
db.mycollection.find({$or:[{"name":"yyy"},{"age":10}]}) --or
db.mycollection.find({"age":{$in:[22, 10]}}) --in
db.mycollection.find({"name":/^w/}) --使用Regex
排序:
db.mycollection.find({}).sort({"age":-1}) --以年齡降序desc
db.mycollection.find({}).sort({"age":1}) --以年齡升序asc
子物件的查詢:
db.foo.find({‘address.city‘:‘beijing‘})
彙總查詢:
db.mycollection.count({}) --mycollection中資料總條數
db.mycollection.count({"age":22}) --滿足條件的資料條數
db.mycollection.distinct("age") --age值的不重複集合
分組group查詢:
db.mycollection.group({
"key":{"age":true},
"initial":{"nihao":[]},
"$reduce":function(cur,prev){
prev.nihao.push(cur.name);
}
})
說明:
key:這個就是分組的key,我們這裡是對年齡分組。
initial: 每組都分享一個”初始化函數“,特別注意:是每一組,比如這個的age=20的value的list分享一個initial函數,age=22同樣也分享一個initial函數。(nihao、cur、prev是自訂的,name是待顯示資料的key)
$reduce(或reduce): 這個函數的第一個參數是當前的文檔對象,第二個參數是上一次function操作的累計對象,第一次為initial中的{”perosn“:[]}。有多少個文檔, $reduce就會調用多少次。
db.mycollection.group({
"key":{"age":true},
"initial":{"nihao":[]},
"reduce":function(cur,prev){
prev.nihao.push(cur.name);
},
"finalize":function(prev){
prev.count=prev.nihao.length;
}
})
說明:
加上一個count屬性標明每個分組中的數量
finalize:這是個函數,每一組文檔執行完後,多會觸發此方法,那麼在每組集合裡面加上count也就是它的活了。
db.mycollection.group({
"key":{"age":true},
"initial":{"nihao":[]},
"reduce":function(cur,prev){
prev.nihao.push(cur.name);
},
"finalize":function(prev){
prev.count=prev.nihao.length;
},
"condition":{"age":{$lt:25}}
})
說明:
condition:這個就是過濾條件。不滿足條件的被過濾掉。
遊標:
(類似順延強制)
var cc=db.mycollection.find({}) --申明一個“查詢結構”cc
cc.next() --需要的時候next讀取一條
cc.forEach(function(x){print(x.age)}) --或通過for迴圈讀取
遊標枚舉完了之後,遊標銷毀,在讀取就沒有資料了
例子:
var cursor = db.C.find() --定義遊標
while(cursor.hasNext()){
var obj = cursor.next();
print(obj.a);
......
}
索引:
效能分析函數(explain):db.mycollection.find({}).explain()
主要欄位解釋:
cursor: 這裡出現的是”BasicCursor",什麼意思呢,就是說這裡的尋找採用的是“表掃描”,也就是順序尋找,很悲催啊。
nscanned: 這裡是10w,也就是說資料庫瀏覽了10w個文檔,很恐怖吧,這樣玩的話讓人受不了啊。
n: 這裡是1,也就是最終返回了1個文檔。
millis: 這個就是我們最最最....關心的東西,總共耗時114毫秒。
db.mycollection.ensureIndex({"name":1}) --使用ensureIndex在name上建立了索引。1表示按照name進行升序,-1表示按照name進行降序
db.mycollection.ensureIndex({"name":1},{"unique":true}) --建立唯一索引,重複的索引值自然就不能插入
db.mycollection.ensureIndex({"name":1, "age":1}) --複合式索引
db.mycollection.find({}).getIndexes()
db.mycollection.getIndexKeys() --查mycollection集合的索引資訊
db.mycollection.find({}).hint({"age":1}) --按自己的方案暴力執行
db.mycollection.dropIndexes("name") --刪除索引
mongodb操作命令