轉自:http://blog.csdn.net/congcong68/article/details/46781777
1、簡介
MongoDB是一個高性能,開源,無模式的文檔型數據庫,是當前NoSQL數據庫產品中最熱門的一種。數據被分組存儲在數據集中,被稱爲一個集合(Collenction)和對於存儲在MongoDB數據庫中的文件,咱們不須要知道它的任何結構定義的自由模式,在存儲數據時是以鍵-值對的集合鍵是字符串,值能夠是數據類型集合裏的任意類型,包括數組和文檔。sql
MongoDB存儲在集合中的全部文件,集合是一組有一組共享公共索引的相關文檔,集合相似於關係數據庫中的表。在MongoDB中,這些操做修改單個採集數據,爲更新和刪除、刪除操做。咱們先認識一下MongDB結構:數據庫
MongoDB數組 |
關係數據庫性能 |
數據庫(database)url |
數據庫(database)spa |
集合(collection) .net |
表(table) code |
文檔(document)blog |
行(row) 索引 |
集合(collection) 文檔(document)
二.MongoDB 添加
1. 添加一個新的文檔到集合語法
- db.collection.insert()
例子:
- >db. orders.insert({
- "onumber" : "001",
- "date" : "2015-07-02",
- "cname" : "zcy",
- })
相對於SQL語句是:
- INSERT INTO orders
- (onumber, date, cname)
- VALUES (「001」,」 2015-07-02」,」 zcy」)
2.同時添加多個文檔,能夠傳入數組
- > db. orders.insert(
- [{
- "onumber" : "001",
- "date" : "2015-07-02",
- "cname" : "zcy",
- },{
- "onumber" : "002",
- "date" : "2015-07-02",
- "cname" : "zcy1",
- }
- ])
3.添加文檔再包含文檔的(層級三級)
例子:
- >db. orders.insert({
- "onumber" : "001",
- "date" : "2015-07-02",
- "cname" : "zcy",
- "items" :[ {
- "ino" : "001",
- "quantity" : 2,
- "price" : 4.0,
- "products" : [
- {
- "pno":"001",
- "pName":"p1"
- },
- {
- "pno":"002",
- "pName":"p2"
- }
- ]
- },{
- "ino" : "002",
- "quantity" : 2,
- "price" : 6.0,
- "products" : [
- {
- "pno":"003",
- "pName":"p3"
- },
- {
- "pno":"004",
- "pName":"p4"
- }
- ]
- }
- ]
- })
說明:
存儲在MongoDB集合中的每一個文檔(document)都有一個默認的主鍵_id,這個主鍵名稱是固定的,它能夠是MongoDB支持的任何數據類型,默認是ObjectId
三. MongoDB 查詢
1.對文檔查詢的語法,咱們在這邊作簡單的介紹,咱們會專門的寫一篇比較詳細的介紹
- >db.collection.find()
執行查詢全部的記錄
2.咱們能夠根據條件查詢
例子:
- >db.orders.find({onumber:'001'});
四. MongoDB 修改
1. 對文檔進行修改的語法
- >db.collection.update(
- <query>,
- <update>,
- upsert:<boolean>,
- multi:<boolean>
- )
參數 |
類型 |
描述 |
query |
document |
要修改哪些的查詢條件,相似於SQL 的 where |
update |
document |
要修改的字段對應的值 |
upsert |
boolean |
可選的,默認值是false。若是根據查詢條件沒找到對應的文檔,若是設置爲true,至關於執行insert,若是設置爲false,不作任何的操做。 |
multi |
boolean |
可選的,默認值是false。若是根據查詢條件找到對應的多條記錄是,若是設置爲false時,只修改第一條,若是設置爲true,所有更新 |
2.對單個字段進行修改
名稱 |
描述 |
$inc |
根據要添加的值遞增該字段的值。 |
$mul |
將該字段的值乘以指定的值 |
$rename |
重命名字段 |
$setOnInsert |
操做時,操做給相應的字段賦值 |
$set |
用來指定一個鍵的值,若是不存在則建立它 |
$unset |
用來指定一個鍵的值,若是不存在不建立建立它 |
$min |
只有當指定的值小於現有字段值時才更新該字段。 |
$max |
只有當指定的值大於現有字段值時才更新該字段。 |
$currentDate |
設置當前日期字段的值,或者做爲一個日期或時間戳。 |
咱們接來對幾個比較經常使用的進行操做說明,其他的語法都是同樣
2) 採用$set來根據查詢條件修改文檔,用來指定一個鍵的值,若是不存在則建立它。
例子:
- > db.orders.update(
- {"onumber" : "001"},
- { $set: { "cname " : "zcy"} },
- false,
- true
- )
SQL語句,若是set指定一個字段修改值時,若是沒有的話會報錯。
- UPDATE orders
- set cname=’zcyUp’
- WHERE onumber=’001’
修改以前:
- > db. orders.insert({
- "onumber" : "001",
- "date" : "2015-07-02",
- })
修改以後:
multi 設置爲true,所有更新
3)$mul 將該字段的值乘以指定的值
語法:
- { $mul: { field: <number> } }
例子:
- >db. orders.update(
- {"ino" : "001"},
- { $mul: {"quantity" :3} }
- )
修改以前:
- >db. orders.insert({
- "ino" : "001",
- "quantity": 2,
- "price" : 4.0
- }
修改以後:
4)$setOnInsert 操做時,操做給相應的字段賦值
語法:
- db.collection.update(
- <query>,
- {$setOnInsert: { <field1>: <value1>, ... } },
- {upsert: true }
- )
例子:
- >db.products.update(
- {"ino" : "001"},
- {
- $set:{ "quantity":3 },
- $setOnInsert:{ "defaultQty":100 }
- },
- {upsert: true }
- )
5)$inc,指定屬性的值加上如今的值,若是鍵不存在則建立它。
語法:
- { $inc: { <field1>: <amount1>,<field2>: <amount2>, ... } }
例子:
- >db. orders.update(
- {"onumber" : "001","items.ino":"001"},
- { $inc: {"items.$.price" : 2.0} }
- )
修改前的數據:
- >db. orders.insert({
- "onumber" : "001",
- "date" : "2015-07-02",
- "cname" : "zcy",
- "items" :[ {
- "ino" : "001",
- "quantity" : 2,
- "price" : 4.0,
- "products" : [
- {
- "pno":"001",
- "pName":"p1"
- },
- {
- "pno":"002",
- "pName":"p2"
- }
- ]
- },{
- "ino" : "002",
- "quantity" : 2,
- "price" : 6.0,
- "products" : [
- {
- "pno":"003",
- "pName":"p3"
- },
- {
- "pno":"004",
- "pName":"p4"
- }
- ]
- }
- ]
- })
修改後的數據:
ino等於001的price變成6
3.對數組進行修改
名稱 |
說明 |
$ |
做爲一個佔位符的更新與查詢條件在一個更新的第一要素 |
$addToSet |
將元素添加到數組中,僅當它們在集合中不存在 |
$pop |
刪除數組的第一個或最後一個項 |
$pullAll |
從數組中移除全部匹配值 |
$pull |
移除匹配指定查詢的全部數組元素 |
$pushAll |
將全部值添加到數組中 |
$push |
將值添加到數組中,若是有的數組存在則向數組末尾添加該值,若是數組不存在則建立該數組並保存該值 |
(1)根據查詢條件修改文檔裏內嵌文檔(第二層級的),例如咱們想修改items 字段ino爲001下的price的4修改8,語法items.$. price ,更新數組中第一個匹配的子文檔,咱們內嵌文檔的ino是惟一的,知足咱們的需求
例子:
- >db. orders.update(
- {"onumber" : "001","items.ino":"001"},
- { $set: {"items.$.price" : 8.0} }
- )
修改前的數據:
修改後的數據:
ino等於001的price值由4修改爲8
ino等於002的price值仍是不變
(2)根據查詢條件修改文檔裏內嵌文檔在內嵌文檔(第三層級的),例如咱們想修改items 字段ino等於001下的products而且pno等於001的pName值爲ps,語法items.0. products.$. pName,0表明items第一個數組(也就是數組的下標),$ 更新數組中第一個匹配的子文檔。
例子:
- >db. orders.update(
- {"onumber" : "001","items.ino":"001","items.products.pno":"001"},
- { $set: {"items.0.products.$.pName": "ps"} }
- )
修改前的數據:
修改後的數據:
(3)$pop刪除數組的第一個或最後一個項
語法:
- { $pop: { <field>: <-1 | 1>,... } }
1最後一項
-1是第一項
例子:
- >db. orders.update(
- {"onumber" : "001"},
- { $pop: {"items" : -1} }
- )
修改前的數據
修改後的數據
把ino等於001刪除,只剩ino爲002
(4)$push將值添加到數組中,若是有的數組存在則向數組末尾添加該值,若是數組不存在則建立該數組並保存該值
語法:
- { $push: { <field1>: <value1>,... } }
例子:
- >db. orders.update(
- {"onumber" : "001"},
- { $push: {"items" : {
- "ino" : "002",
- "quantity" :2,
- "price" : 6.0,
- "products" : [
- {
- "pno":"003",
- "pName":"p3"
- },
- {
- "pno":"004",
- "pName":"p4"
- }
- ]
- }
- } }
- )
修改前的數據:
- >db. orders.insert({
- "onumber" : "001",
- "date" : "2015-07-02",
- "cname" :"zcy",
- "items" :[ {
- "ino" : "001",
- "quantity": 2,
- "price" : 4.0,
- "products" : [
- {
- "pno":"001",
- "pName":"p1"
- },
- {
- "pno":"002",
- "pName":"p2"
- }
- ]
- }
- ]
- })
修改後的數據:
$pull與$push相反,這邊就不介紹了。
5)刪除集合中某一字段
//例如要把User表中address字段刪除 db.User.update({},{$unset:{'address':''}},false, true)
5、MongoDB刪除
(1) 刪除文檔
語法
db.collection.remove()
例子:
1)db. orders.remove({})
刪除orders集合的全部數據,集合還存在,索引都還存在,至關與SQ的truncate命令
2)db. orders.remove({"onumber": "001"})根據條件刪除數據
(2) 刪除集合
語法:
db.collection.drop() 集合、索引都不存在了。