2017年12月15日 星期五

MongoDB 筆記 (三) : update / replace

要改野, 最直接就更係諗到 update 喇, 不過 update 同 insert 一樣, 都有幾款, 另外仲有個 replaceOne.


  • db.collection.update()
  • db.collection.updateOne()
  • db.collection.updateMany()
  • db.collection.replaceOne()

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>,
     collation: <document>
   }
)
update 真係要好小心, 就咁睇好簡單, 比個 query 佢 update 就得.
比如話, 要將 Super169 既身高改為 167, 好直接會咁寫吧:

db.user.update({id:"Super169"},{height:167})
咁你就出事了.....之後 Super169 既 document 就咁無左, 得番 一份 {heigth:167} 既 document.
因為佢既 update, by default 係去 replace 成張 document.

要做到想要既 update, 就要加多個 $set 既 operator:

db.user.update({id:"Super169"},{$set: {height:167}})
真係幾危險架, 因為一張 document, 入面可以裝住成大抽野, 一下就無左, 真係唔知點算.

MongoDB 筆記 (二) : find



find() - 應該係最常用既 method 了

query:  一個 JSON object 去比 condition
projection: Define 個  output 既 file list

講都唔易, 用例子最實際, 全部用 user collection 去玩:

1) 搵哂全部人:
  • db.uesr.find()
2) 搵個 id 係 Super169 既:
  • db.user.find({id : "Super169"})
3) 搵個 height 大於 160 既:
  • db.user.find({height : { $gt : 160 }}) 
4) 搵個 height 大於 150 但又不超過 165 既:
    • db.user.find({height : { $gt : 150, $lte : 165 }})
    5) 搵個 weight 最少 50, 而 height 不超過 150:
        • db.user.find({ $and: [{weight : {$gte:50}}, {height : { $lte : 150 }}]})
        6) 搵 Super167 同 Super169:
            • db.user.find({ id : { $in : ["Super167","Super169"] }})
            7) 搵 ..... 咁多野搵, 自己試下喇.  黎黎去去, 都係 $and, $or, $gt, $lt, .... 呢D野, 試多D就得.

                仲有個好好玩既, 在 find(...) 之後, 加個 .pretty(), 就會 return format 左既 JSON object.

                例如:

                • db.user.find({id : "Super169"}).pretty()


                不過, 純粹自己 check 果陣易睇, program 入面就無謂浪費了.



                MongoDB 筆記 (一) : insert

                識搵野唔識入野都無用, MongoDB 入野, 有幾個方法:


                • db.collection.insert()
                • db.collection.insertOne()
                • db.collection.insertMany()

                db.collection.insert(
                   <document or array of documents>,
                   {
                     writeConcern: <document>,
                     ordered: <boolean>
                   }
                )
                可以用黎加一份 document (可以睇成係一隻 JSON record), 或者成個 array 既 documents

                例如:
                • db.sample.insert({user:"Super169"})
                • db.sample.insert([{user:"Super167"},{user:"Super168"},{user:"Super169"}])


                writeConcern 比較複雜, 我自己都唔係好明, 有興趣自己睇喇, 平時我都唔用(應該係唔識用).


                db.collection.insertOne(
                   <document>,
                   {
                      writeConcern: <document>
                   }
                )
                唔駛多講, 只可以 insert 一份 document, 唔可以成個 array 比佢.

                例如:
                • db.sample.insertOne({user:"Super169"})

                db.collection.insertMany(
                   [ <document 1> , <document 2>, ... ],
                   {
                      writeConcern: <document>,
                      ordered: <boolean>
                   }
                )
                同 insertOne 對著幹, 只可以成個 array 比佢, 唔可以單獨一份 document.
                不過, 個 array 入面可以只係得一份 document....甚至無野.

                例如:
                • db.sample.insertMany([{user:"Super167"},{user:"Super168"},{user:"Super169"}])


                insert, insertOne 同 insertMany 有乜分別?

                無事無幹, 對個 collection 而言, 係無分別既, 你可以用哂 insert 唔駛煩.
                不過, 佢地既 return object 就有 D 唔同, 你要做 error handling, 就要識分.

                例如:

                • db.sample.insert({user:"Super169"})
                WriteResult({ "nInserted" : 1 })
                • db.sample.insertOne({user:"Super169"}) 
                {        "acknowledged" : true,        "insertedId" : ObjectId("5901a950276033a2cfe79009")}

                • db.sample.insert([{user:"Super167"},{user:"Super168"},{user:"Super169"}])
                BulkWriteResult({
                        "writeErrors" : [ ],
                        "writeConcernErrors" : [ ],
                        "nInserted" : 3,
                        "nUpserted" : 0,
                        "nMatched" : 0,
                        "nModified" : 0,
                        "nRemoved" : 0,
                        "upserted" : [ ]
                })
                • db.sample.insertMany([{user:"Super167"},{user:"Super168"},{user:"Super169"}])
                {
                        "acknowledged" : true,
                        "insertedIds" : [
                                ObjectId("5901a9e9276033a2cfe7900d"),
                                ObjectId("5901a9e9276033a2cfe7900e"),
                                ObjectId("5901a9e9276033a2cfe7900f")
                        ]
                }
                至於用邊個, 睇下你自己想點了.  insert 完想攞番個 key 去再做野, 就用 insertOne 或者 insertMany, 否則, insert 完知道得唔得就夠, 用 insert 就可以了.


                MongoDB 筆記 (序)

                學新野, 當然要記低 D 重點, 不斷重溫, 直到入哂腦..

                MongoDB 同以往用開既 SQL Server 其實真係好唔同, 好多野唔可以用 relational database 去諗.
                要慢慢改變自己諗野既方式, 而且, 我都唔係好肯定, 自己學到既有無錯, 仲要慢慢研究.

                有乜野想查, 最直接就係去官網睇  MONGODB MANUAL


                首先, 有幾個重要指令, 有用得黎有應該唔會常用:

                • show dbs -  顯示 server 上有既 db 
                • use <db> - 同 SQL server 一樣, 轉去指定既 db
                • show collections - 顯示 現在的 db 上的 collection 
                • db.<collection>.drop() - 成個 collection 剷走佢
                • db.stats() - 睇下 db 既資料
                • db.<collection>.status() - 睇下 collection 既資料
                以上都同 data 無乜大關係, 一般我地最常做既, 不外乎 insert, retrieve, update, delete: