㈠ mongodb 怎麼設置 unique key
只有mongodb默認的key鍵_id是unique的,其餘的鍵想unique只能程序控制了。
㈡ mongodb的一些基本操作
貌似沒遇到過你說的的問題,可以截圖看看
㈢ MongoDB問題,下載完配置好服務可以連接但就是無法進入資料庫似乎缺少什麼東西但不知道怎麼解決
@MongoDB安裝後的一些簡要配置:
1)在和bin目錄同級的目錄下面建一個data文件夾,data文件夾下面分別建立db和log文件夾來存儲數據文件和日誌文件【ps:也可以建立其他文件夾,自己知道在什麼地方即可】
2)在和bin目錄同級的目錄下面建一個mongo.config文件(編碼格式為utf8無bom格式,否則會報錯),作為mongodb的配置文件。[ps:在啟動的時候會用到]
---mongo.config文件內容如下:
##數據文件
dbpath=D:\mongodb\data\db
##日誌文件
logpath=D:\mongodb\data\log\mongo.log
#錯誤日誌採用追加模式,配置這個選項後mongodb的日誌會追加到現有的日誌文件,而不是從新創建一個新文件
logappend=true
#啟用日誌文件,默認啟用
journal=true
#這個選項可以過濾掉一些無用的日誌信息,若需要調試使用請設置為false
㈣ mongodb怎麼查詢數組中的值
mongodb中使用aggregate可以返回數組欄位數組的指定索引的元素
參考語句:
{$match:{'id':15}},
{$project:{id:1,"default":1}},
{$unwind:"$default.styles"},
{$match:{'default.styles.status':1}},
{$group:{_id:"$_id","defaults":{$push:"$default.styles"}}}
解釋:
1:過濾數據{$match:{'id':15}}
2:獲取想要的列{$project:{id:1,"default":1}}
3:獲取展開後數組欄位{$unwind:"$default.styles"}
4:條件查詢數組元素{$match:{'default.styles.status':1}}
5:分組後保存結果{$group:{_id:"$_id","defaults":{$push:"$default.styles"}}}
㈤ MongoDB自動分片介紹
1. 片鍵介紹
數據劃分(partitioning)關鍵問題是怎麼樣將一個集合中的數據均衡的分布在集群中的節點上。 MongoDB 數據劃分的是在集合的層面上進行的,它根據片鍵來劃分集合中的數據。
(1)使用片鍵的取值范圍指定數據塊
設置分片的時候,需要從集合里選出一個欄位,用該欄位的值作為數據拆分的依據,這個欄位稱為片鍵(shard key),文檔中的數據按照這個欄位排序切分成塊,分布到各個片上。比如說有個表示人員的集合,如果選擇名字(「name」)欄位作為片鍵,第一片可能會存放名字以A F開頭的文檔,第二個存放的是以G P開頭的文檔,第三個存的Q~Z的名字。隨著添加(刪除)片,MonogDB會重新平衡數據,使每片的流量都比較均衡,數據量也在合理范圍內。
按照片鍵取值范圍來作為數據塊劃分的區間依據,優點是按范圍查詢的時候它的效率很高,當給定一個查詢范圍,根據mongos中的映射表可以很快的定位到分片上的數據塊。除此之外當兩個分片的鍵取值比較靠近的時候,會被放到相近的塊中,由於數據的局部性原理,這樣的話可以加快查詢效率,同時也可以減少內存換頁次數。
缺點是可能會導致數據分布不均衡,如果選擇的片鍵具有線性的性質,例如時間,將其作為片鍵的話 ,在某個時間段的寫請求(讀請求)都會被映射到同一個分片的同一個數據塊上, 這樣的話不僅會降低系統的讀寫性能,而且也會因寫操作過於集中導致片間的不平衡。
(2)按照片鍵哈希值來作為數據塊的劃分區間依據
優點是可以確保一個比較均衡的數據分布,因為即使當兩個文檔的片鍵取值很接近的時候,例如上面例子中一個x=25,一個x=26,它們的哈希結果也會有很大的差別,這樣的話數據會隨機的分布到集群中,有利於數據的均衡的分布,減少數據塊的移動次數,同時由於數據分散會減少單個數據塊的寫操作的壓力,提高寫入速度。
缺點是隨機劃分導致數據過於分散,當要查詢某個范圍內的數據時比如年齡大於20小於25的所有男生信息,如果直接使用范圍劃分的話,由於其具有良好的數據局部性特點,可能只要訪問幾個相鄰的數據塊就行了, 但是如果要使用哈希劃分的方法很可能要訪問所有的數據塊。
(3)取值有限的片鍵
這是一種粗力度的片鍵,比如上邊說的用戶ID。如果按照用戶ID分片,你可以預料到插入會分布在各個分片上,因為無法預知哪個用戶何時會插入數據。這樣一來,粗粒度分片鍵也能擁有隨機性,還能發揮分片集群的優勢。而且粗粒度的片鍵還能使用局部性帶來的效率提升。當某個用戶上傳100個文件,基於用戶ID欄位的分片建能確保這些插入都落到同一個分片上,並幾乎能寫入索引的同一部分,這樣效率很高。粗粒度分片鍵在分布性和局部性上都表現很好,但是它也有一個很難解決的問題:塊有可能無限制的增長。想想基於用戶ID的片鍵,假如有幾個特殊用戶,他們上傳了上百萬個文件,那麼一個塊里就可能只有一個用戶ID,這個塊能拆分么?不能,因為用戶ID是最小的粒度,拆分了查詢就沒法路由到數據。這就造成分片之間數據量不均衡。更典型的就是type,status這類的欄位,因為它們的選擇性實在是太低,導致無法拆分。片鍵基比較小時,所有的鍵值相同導致MongoDB不能分裂Chunk,遷移這些不可分裂的Chunk將更加耗時,即使遷移後也難以保證數據在各個分片上的平衡。Chunk數量被基約束住後,我們就不能利用MongoD分片集群特性將集合部署到更多的機器。
2. 片鍵的選取原則
在Sharding結構中,分片策略,片鍵選擇是影響性能的關鍵因素,片鍵不僅影響數據分布,而且影響業務邏輯,所以片鍵的選擇不單單是均勻的將數據分布到各個片上,而且要考慮查詢的性能。壞的片鍵有時候會導致數據分布很差,有時候會導致無法使用局部性原理,還有一些會影響數據塊的拆分。
上邊我們討論了低效片鍵的問題和原因,理想的片鍵應該結合粗粒度分片鍵與細粒度片鍵兩者的優勢。
一個好的片鍵必須包含的特性:
1、保證CRUD能利用局限性 ==》升序片鍵的優點
2、將插入數據均勻分布到各個分片上 ==》隨機片鍵的優點
3、有足夠的粒度進行塊拆分 ==》粗粒度片鍵的優點
滿足這些要求的的片鍵通常由兩個欄位組成,第一個是粗粒度,第二個是粒度較細。那麼我們需要使用復合片鍵。例如對上面的例子,選取{userid:1,_id:1}作為片鍵,當用戶同時插入數據時,我們可以預見大多數情況下,這些數據會被均勻的分布到所有的片上,而且分片里的唯一欄位_id能保證對任意一個文檔的查詢和更新始終都能指向單個分片。如果對用戶ID執行更復雜的查詢,那麼路由也只會將查詢路由包含此用戶ID存在的片上,而不會發到所有分片。由於_id(升序)的存在,保證了塊始終是能繼續拆分的,哪怕用戶創建了大量文檔,情況也是如此。
所以在選擇片鍵時盡量能保持良好的數據局部性而又不會導致過度熱點的出現,很多時候,組合片鍵是一種比較常用的做法。
除此之外,也可以選擇我們經常查詢的欄位作為片鍵,這類分片鍵可以使得查詢時mongos僅僅將查詢發送給特定的mongod實例,不需要等待多個實例返回數據後再進行合並。
㈥ mongodb 可以對Mixed類型的欄位進行過濾嗎
var start = new Date(2010, 3, 1);
var end = new Date(2010, 4, 1);
db.posts.find({created_on: {$gte: start, $lt: end}});
(代碼內日期可自行設置內修改)容
㈦ mongodb 一個文檔內數組中同一個欄位 同時大於或小於一個值,如何寫查詢條件
mongodb中使用aggregate可以返回數組欄位數組的指定索引的元素
參考語句:
{$match:{'id':15}},
{$project:{id:1,"default":1}},
{$unwind:"$default.styles"},
{$match:{'default.styles.status':1}},
{$group:{_id:"$_id","defaults":{$push:"$default.styles"}}}
解釋:
1:過濾數據{$match:{'id':15}}
2:獲取想要的列{$project:{id:1,"default":1}}
3:獲取展開後數組欄位{$unwind:"$default.styles"}
4:條件查詢數組元素{$match:{'default.styles.status':1}}
5:分組後保存結果{$group:{_id:"$_id","defaults":{$push:"$default.styles"}}}
數據結構如下:
{
"_id" : ObjectId("55dad346ea23e7c11beefce5"),
"id" : 11.0,
"default" : {
"style" : "普通會診",
"alias" : "",
"money" : "0",
"styles" : [{
"code" : 1,
"style" : "普通會診",
"alias" : "一般會診",
"money" : 100,
"status" : 1,
"remark" : "需要患者親自來到醫院"
} {
"code" : 6,
"style" : "夜間門診",
"alias" : "夜間門診",
"money" : 100,
"status" : 0,
"remark" : "夜間門診"
}, {
"code" : 7,
"style" : "其他門診",
"alias" : "其他門診",
"money" : 10,
"status" : 0,
"remark" : "其他門診"
}]
}
}