mongoDB筆記

MongoDB不支持外鍵,事務,數據類型約定的非關係型數據庫。正則表達式


在MongoDB中,一個數據庫包含多個集合,相似於MySQL中一個數據庫包含多個表;一個集合包含多個文檔,相似於MySQL中一個表包含多條數據。
文檔是MongoDB的核心,多個鍵及其關聯的值放在一塊兒就是文檔。在Mongodb中使用一種類json的bson存儲數據,bson數據能夠理解爲在json的
基礎上添加了一些json中沒有的的數據類型。mongodb

啓動:shell

$sudo service mongodb start
$mongo #進入到mongo命令行

集合和文檔的基本操做:
createCollection():建立集合
db.COLLECTION.drop():刪除集合
db.COLLECTION_NAME.insert(document):插入文檔
db.COLLECTION_NAME.update(SELECTION_CRITERIA,UPDATED_DATA):更新文檔
db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA}):替換已存在的文檔
db.COLLECTION_NAME.remove(DELECTION_CRITERIA):刪除文檔數據庫

數據庫操做:
use DatabaseName #建立鏈接到test數據庫
show dbs #查看全部數據庫
(空數據庫不顯示/顯示test(empty))
db.dropDatabase() #銷燬數據庫
db.createCollection(COLLECTION_NAME) #建立集合json

show collections #查看集合
>db.users.insert([
... {name:"jam",
... email:"jam@qq.com"
... },
... {name:"tom",
... email:"tom@qq.com"
... }
... ])#插入數據,若是插入時users集合沒有建立會自動建立
>db.COLLECTION_NAME.save([
... {name:"jam",
... email:"jam@qq.com"
... },
... {name:"tom",
... email:"tom@qq.com"
... }
... ])#插入數據,若是插入時users集合沒有建立會自動建立(至關於update)

db.COLLECTION_NAME.update(SELECTION_CRITERIA,UPDATE_DATA) #update
>db.shiyanlou.update({key1:value1,key2:value2},{$set:{key2:value2}},{multi:true})

#默認的 update 函數只對一個文檔更新,若是想做用全部文檔,則須要加入 multi:true
替換已存在的文檔
db.COLLECTION_NAME.save({_id:ObjectId(),NEW_DATA})
刪除文檔
db.COLLECTION_NAME.remove(DELECTION_CRITERIA)
>db.shiyanlou.remove({"name":"Bob"})
查詢:
find()用法:數組

db.COLLECTION_NAME.find()
>use post
>db.post.insert([
.....
.....
])
>db.post.find() #查詢全部記錄
>db.post.find().pretty() #pretty()可使查詢輸出的結果更美觀

若是你想讓 mongo shell 始終以 pretty 的方式顯示返回數據,能夠經過下面的指令實現:bash

echo "DBQuery.prototype._prettyShell = true" >> ~/.mongorc.js

多條件查詢:
and: 當 find() 中傳入多個鍵值對時,MongoDB 就會將其做爲 AND 查詢處理服務器

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

同時使用and,or:數據結構

> db.post.find({
  "likes": {$gt:10},
$or: [
  {"by": "shiyanlou"},
  {"title": "MongoDB Overview"}
  ]
}).pretty()

模糊查詢:
{"name":/^start/}
{"name":/tail^/}
#########################
高級查詢:聚合,索引
#########################
條件操做符:
gt:>
lt:<
gte:>=
lte:<=
=====================================================================
$type[key]框架

可選的 key 值以下:
1: 雙精度型(Double)
2: 字符串(String)
3: 對象(Object)
4: 數組(Array)
5: 二進制數據(Binary data)
7: 對象ID(Object id)
8: 布爾類型(Boolean)
9: 數據(Date)
10: 空(Null)
11: 正則表達式(Regular Expression)
13: JS代碼(Javascript)
14: 符號(Symbol)
15: 有做用域的JS代碼(JavaScript with scope)
16: 32位整型數(32-bit integer)
17: 時間戳(Timestamp)
18: 64位整型數(64-bit integer)
-1: 最小值(Min key)
127: 最大值(Max key)

>db.shiyanlou.find({"name":{$type:2}}) #查找 name 是字符串的文檔記錄
>db.shiyanlou.find({"name":{$type:'string'}}) #和上面的效果相同

======================================================================
limit和skip
limit:讀取指定數量的數據記錄

>db.shiyanlou.find().limit(1) #讀取一條記錄,默認第一條

skip:讀取時跳過指定數量的數據記錄

>db.shiyanlou.find().limit(1).skip(1)

=========================================
排序sort,升序用1表示,降序用-1表示

>db.shiyanlou.find().sort({"time":1})

=========================================
索引:
索引是特殊的數據結構,索引存儲在一個易於遍歷讀取的數據集合中,索引是對數據庫集合中一個文檔或多個文檔的值進行排序的一種結構

db.COLLECTION_NAME.ensureIndex({KEY:1|-1})
>db.shiyanlou.ensureIndex({"name":1})

可選參數:

background Boolean 創建索引要不要阻塞其餘數據庫操做,默認false
unique Boolean 創建的索引是否惟一,默認false
name string 索引的名稱,若未指定,系統自動生成
dropDups Boolean 創建惟一索引時,是否刪除重複記錄,默認false
sparse Boolean 對文檔不存在的字段數據不啓動索引,默認false
expireAfterSeconds Boolean 設置集合的生存時間,單位爲秒
v index version
weights document 1-99999
default-language string 默認爲英語
language_override string 默認爲language

> db.shiyanlou.ensureIndex({"user_id":1,"name":1},{background:1})

聚合aggregate():

db.COLLECTION_NAME.aggregate({
$match:{x:1},
{limit:NUM},
$group:{_id:$age}
})

可選參數:

$match:查詢,跟 find 同樣;
$limit:限制顯示結果數量;
$skip:忽略結果數量;
$sort:排序;
$group:按照給定表達式組合結果

聚合表達式:

$sum,$avg,$min,$max,
$push #在結果文檔中插入值到一個數組
$addToSet #在結果文檔中插入值到一個數組,但不建立副本
$first #根據資源文檔的排序獲取第一個文檔數據
$last #根據資源文檔的排序獲取最後一個文檔數據

管道:
MongoDB 的聚合管道將 MongoDB 文檔在一個管道處理完畢後將結果傳遞給下一個管道處理。管道操做是能夠重複的。

表達式:處理輸入文檔並輸出。表達式是無狀態的,只能用於計算當前聚合管道的文檔,不能處理其它的文檔。 聚合框架中經常使用的幾個操做:

$project:修改輸入文檔的結構。能夠用來重命名、增長或刪除域,也能夠用於建立計算結果以及嵌套文檔。
$match:用於過濾數據,只輸出符合條件的文檔。$match 使用 MongoDB 的標準查詢操做。
$limit:用來限制 MongoDB 聚合管道返回的文檔數。
$skip:在聚合管道中跳過指定數量的文檔,並返回餘下的文檔。
$unwind:將文檔中的某一個數組類型字段拆分紅多條,每條包含數組中的一個值。
$group:將集合中的文檔分組,可用於統計結果。
$sort:將輸入文檔排序後輸出。
$geoNear:輸出接近某一地理位置的有序文檔。
> db.shiyanlou.aggregate([{$match:{user_id:{$gt:0,$lte:2}}},{$group:{_id:"user",count:{$sum:1}}}])
{"_id":"user","count":2}


文檔邏輯關係:
{user doc}
{address doc}
1.嵌入式關係(適合一對一關係)

{user doc
[{address doc}]
}

2.引用關係:將兩個文檔分開,經過引用文檔的_id字段來創建關係(適合一對多,多對多)

{user doc
"address_ids":[
ObjectId("448664345476436400000")
]#對應address doc id
}

集合:
集合就是一組文檔的組合,就至關因而關係數據庫中的表,在MongoDB中能夠存儲不一樣的文檔結構的文檔
{"company":"Chneshi keji"}{"people":"man","name":"peter"}

元數據:
數據庫的信息存儲在集合中,他們統一使用系統的命名空間:DBNAME.system.* DBNAME 可用 db 或數據庫名替代

DBNAME.system.namespaces :列出全部名字空間DBNAME.system.indexs :列出全部索引DBNAME.system.profile :列出數據庫概要信息DBNAME.system.users :列出訪問數據庫的用戶DBNAME.system.sources :列出服務器信息

相關文章
相關標籤/搜索