1. 程式人生 > >MongoDB的增刪改查操作

MongoDB的增刪改查操作

插入語句

MongoDB的 插入語句之前也有過介紹了,這裡我們只做一個簡單的示例:

> db.customers.insert({id:11,name:'lisi',orders:[{orders_id:1,create_time:'2017-02-06',products:[{product_name:'MiPad',price:'$100.00'},{product_name:'iphone',price:'$399.00'}]}],mobile:'13161020110',address:{city:'beijing',street:'taiyanggong'}})

> db.customers.find({'orders.0.products.1.product_name'
:'iphone'}) { "_id" : ObjectId("58983d0fc55e261327343eab"), "id" : 11, "name" : "lisi", "orders" : [ { "orders_id" : 1, "create_time" : "2017-02-06", "products" : [ { "product_name" : "MiPad", "price" : "$100.00" }, { "product_name" : "iphone", "price" : "$399.00" } ] } ], "mobile" : "13161020110", "address" : { "city"
: "beijing", "street" : "taiyanggong" } }

注意:
1、MongoDB第一次插入資料時,不需要事先建立集合collection,插入時自動建立;
2、每次插入時,不需要顯示的指定_id,MongoDB預設建立該欄位作為主鍵(當然,也可以自己指定),_id為ObjectId型別的值,由12個位元組組成,分別是時間戳,精確到秒(4位元組),機器唯一標識(3位元組),程序ID(2位元組),隨機數(3)位元組,如 58983d0fc55e261327343eab解釋為58983d0f,為1970年到如今的時間差(秒),c55e26,為機器唯一標示符,1327為程序ID(十六進位制),343eab,為隨機數;
3、MongoDB中每一個collection中必須有一個_id欄位,且必須值唯一。

修改語句

MongoDB的修改語句語法如下所示:

db.collection.update(query,update,<upsert>,<multi>)

update表示需要修改的地方,如果只包含欄位,而沒有操作符,則會發生取代性修改,該欄位一般儘量攜帶操作符,防止導致因修改一個欄位而刪除其他欄位
upsert可選,預設false,true時表示如果沒有匹配到記錄,則插入
multi可選,預設false,預設只更新匹配到的第一個文件,true時表示更新所有匹配到的記錄

示例:

> db.user.insert({id:11,name:'lisi',orders:[{orders_id:1,create_time:'2017-02-06',products:[{product_name:'MiPad',price:'$100.00'},{product_name:'iphone',price:'$399.00'}]}],mobile:'13161020110',address:{city:'beijing',street:'taiyanggong'}})
> db.user.find()
{ "_id" : ObjectId("589c0fc4c55e261327343eb1"), "id" : 11, "name" : "lisi", "orders" : [ { "orders_id" : 1, "create_time" : "2017-02-06", "products" : [ { "product_name" : "MiPad", "price" : "$100.00" }, { "product_name" : "iphone", "price" : "$399.00" } ] } ], "mobile" : "13161020110", "address" : { "city" : "beijing", "street" : "taiyanggong" } }
> db.user.update({id:11},{$set:{name:"lisisi",age:18}})
> db.user.find()
{ "_id" : ObjectId("589c0fc4c55e261327343eb1"), "address" : { "city" : "beijing", "street" : "taiyanggong" }, "age" : 18, "id" : 11, "mobile" : "13161020110", "name" : "lisisi", "orders" : [ { "orders_id" : 1, "create_time" : "2017-02-06", "products" : [ { "product_name" : "MiPad", "price" : "$100.00" }, { "product_name" : "iphone", "price" : "$399.00" } ] } ] }

更改多個文件,或找不到則插入(不可同時):

> db.user.update({id:12},{$set:{name:"lisisi",age:18}},{multi:true})
> db.user.update({id:12},{$set:{name:"lisisi",age:18}},{upsert:true})
> db.user.find()
{ "_id" : ObjectId("589c0fc4c55e261327343eb1"), "address" : { "city" : "beijing", "street" : "taiyanggong" }, "age" : 18, "id" : 11, "mobile" : "13161020110", "name" : "lisisi", "orders" : [ { "orders_id" : 1, "create_time" : "2017-02-06", "products" : [ { "product_name" : "MiPad", "price" : "$100.00" }, { "product_name" : "iphone", "price" : "$399.00" } ] } ] }
{ "_id" : ObjectId("589c11513b5012ba1ce5500e"), "age" : 18, "id" : 12, "name" : "lisisi" }

刪除語句

MongoDB中的刪除語句與RDB中的delete類似,只是名字叫remove,其語法如下:

db.collection.remove(<query>,<justOne>)

query為可選引數,類似where
justOne是一個Boolean值,表示只刪除匹配到的第一個文件(即記錄)
注意:如果不指定任何引數,則將刪除所有記錄,但是索引資料不會被刪除,如果需要刪除記錄以及索引,則需要單獨去drop掉索引

示例如下:

> db.user.remove({id:12},false)
> db.user.find()
{ "_id" : ObjectId("589c0fc4c55e261327343eb1"), "address" : { "city" : "beijing", "street" : "taiyanggong" }, "age" : 18, "id" : 11, "mobile" : "13161020110", "name" : "lisisi", "orders" : [ { "orders_id" : 1, "create_time" : "2017-02-06", "products" : [ { "product_name" : "MiPad", "price" : "$100.00" }, { "product_name" : "iphone", "price" : "$399.00" } ] } ] }
> db.user.remove({},false)
> db.user.find()
>

可以看到刪除後的結果,為空,
去看下索引:

> db.system.indexes.find()
{ "v" : 1, "name" : "_id_", "key" : { "_id" : 1 }, "ns" : "test.customers" }
{ "v" : 1, "name" : "id_1_age_1", "key" : { "id" : 1, "age" : 1 }, "ns" : "test.customers" }
{ "v" : 1, "name" : "orders.products.product_name_1", "key" : { "orders.products.product_name" : 1 }, "ns" : "test.customers" }
{ "v" : 1, "name" : "orders.orders_id_1", "key" : { "orders.orders_id" : 1 }, "ns" : "test.customers" }
{ "v" : 1, "name" : "_id_", "key" : { "_id" : 1 }, "ns" : "test.user" }

索引則還存在。

鎖機制

MongoDB的讀寫鎖,基本與RDB類似,沒有什麼特殊的地方,需要注意的是,目前來講,MongoDB的鎖機制還是與RDB(關係型資料庫)存在一定的差距的。