《MongoDB權威指南》學習摘錄php
該操做文檔會自動生成一個"_id"鍵python
>db.foo.insert({「bar」 : 「baz」})
>db.foo.batchInsert([{ "_id" : 0 } , { "_id" : 1 } , { "_id" : 2 }])
當前mongodb能接受的最大消息長度是48MB,而且若是在執行批量插入過程當中有一個文檔插入失敗,則在該文檔以前的全部文檔都會成功插入到集合中,而這個文檔以後的全部文檔所有插入失敗。正則表達式
//刪除foo集合的全部文檔 >db.foo.remove() //刪除指定查詢文檔做爲可選參數 >db.mailing.list.remove( { 「opt-out」 : true } )
>db.foo.drop()
{ "_id": ObjectId("..."), "name": "joe", "friends": 32, "enemies": 2 }
如今須要更新"friends"和"enemies"兩個字段到"relationships"子文檔中mongodb
>var joe = db.users.findOne({"name":joe}); >joe.relationships = {"friends":joe.friends,"enemies":joe.enemies}; { "friends":32, "enemies":2 } >joe.username = joe.name; "joe" >delete joe.friends; true >delete joe.enemies; true >delete joe.name; true >db.users.update({"name":"joe"},joe);
更新後的文檔json
{ "_id":ObjectId("..."), "username":"joe", "relationships":{ "friends":32, "enemies":2 } }
常見的錯誤是查詢條件匹配到多個文檔,而後更新的時候回因爲第二個參數的存在就產生重複的"_id"值,對於這種狀況要使用"_id"值來進行查詢數組
"$inc"修改器使用bash
當有人訪問頁面的時候,就經過url找到該頁面,而後使用"$inc"修改器增長"pagerviews"的值函數
{ "_id":ObjectId("..."), "url":"www.lgybetter.com", "pagerviews":52 }
>db.analytics.update({"url":"www.lgybetter.com"},{"$inc" : {"pagerviews" : 1}})
注意,使用修改器時,"_id"並不會改變,而文檔替換過則會post
"$set"修改器使用學習
>db.user.update({"_id":ObjectId(...)},{"$set" : {"favorite book" : "War and Peace"}})
因而更新後的文檔就有了"favorite book"鍵,若是要繼續修改則:
>db.user.update({"_id":ObjectId(...)},{"$set" : {"favorite book" : "Green Eggs and Ham"}})
也能夠變爲數組的類型
使用"$unset"能夠將這個鍵徹底刪除:
>db.user.update({"name":joe},{"$unset" : {"favorite book" : 1}})
"$push"修改器使用
若是數組存在,"$push"會向已有的數組的末尾加入一個元素,若是沒有改數組就建立一個新的數組
{ "_id":ObjectId("..."), "title":"A blog post", "content":"..." }
>db.blogs.posts.update({"title" : "A blog post"},{"$push" : { "comments" : {"name" : "joe","email" : "joe@example.com","content":"nice post."} }}) >db.blog.posts.findOne() { "_id":ObjectId("..."), "title":"A blog post", "content":"...", "comments": [ { "name":"joe", "email":"joe@example.com", "content":"nice post" } ] }
注意,"$push"會建立一個數組的類型,可用於動態添加數據
用"$push"一次添加多個數據,配合使用"$each"
>db.stock.ticker.update({"_id":"GOOG"},{ "$push" : {"hourly" : { "$each" : [ 562.776,562.790,559.123 ]}} })
使用"$slice"來固定數組的最大長度
>db.movies.find({"genre" : "horror"},{ "$push" : { "top10" : { "$each" : ["Nightmare on Elm Street" , "Saw"], "$slice" : -10, "$sort" : {"rating" : -1} } } })
注意,"$slice"的值應該是負整數,"$sort"能夠用來對數組中的全部對象進行排序,不能只將"$slice"或者"$sort"與"$push"配合使用,且必須使用"$each"。
使用"$ne",使得數組變爲數據集合
>db.paper.update({"authors cited" : {"$ne" : "Richie"}, {"$push" : {"authors cited" : "Richie"}} })
"$addToSet"和"$each"組合使用,效果是與"$ne"同樣,可是能夠用來同時插入多條數據
>db.users.update({"_id" : ObjectId("...")}, {"$addToSet" : {"emails" : {"$each" : ["joe@php.net","joe@example.com","joe@python.org"] }} })
使用"$pop"刪除數組元素{"$pop" : {"key" : 1}}從數組末尾刪除,{"$pop" : {"key" : -1}}從數組頭部刪除
使用"$pull"刪除元素
>db.lists.update({},{"$pull" : {"todo" : "laundry"}})
upsert是一種特殊的更新,要是沒有找到符合更新條件的文檔,就會以這個條件和更新
文檔爲基礎建立一個新的文檔。
>db.analytics.update({"url" : "/blog"} , {"$inc" : {"pageviews" : 1}} ,true)
有時候,須要在建立文檔的同時建立字段併爲它賦值,可是在以後的全部更新操做中,該字段的值就再也不改變。這時候就使用"$setOnInsert"
>db.users.update({} , {"$setOnInsert" : {"createdAt" new Date()}},true)
具體的操做值經過:
>db.runCommand({getLastError:1})
返回結果
{ "err":null, "updatedExisting":true, "n":5, "ok":true }
查詢該集合下的全部文檔
>db.c.find()
查詢特定值的文檔,能夠同時添加多個條件
>db.users.find({"age" : 20}) >db.users.find({"age" : 20 , "name" : "lgy"}) //指定須要返回的鍵 >db.users.find({} , {"username" : 1,"email" : 1}) //返回結果 { "_id":ObjectId("..."), "username":"lgy", "email":"lgy@example.com" }
經過查詢,默認狀況下回返回"_id"這個鍵,若是但願不出現其餘的鍵值,就使用以下:
>db.users.find({},{"username" : 1,"_id" : 0}) //返回結果 { "username":"lgy" }
查詢條件:
"$lt","$lte","$gt","$gte"就是所有的比較操做符,分別對應<,<=,>,>=
//查詢18 ~ 30歲的用戶: >db.users.find({"age" : {"$gte" : 18 , "$lte" : 30}})
"$ne"表示不等於某個特定的值
//查詢用戶名不爲"lgy"的全部用戶 >db.users.find({"username" : {"$ne" : "lgy"}})
OR查詢:
"$in" 和 "$or"兩種方式進行OR查詢
>db.raffle.find({"ticket_no" : {"$in" : [725,542,390]}})
"$nin"是與"$in"相反的
>db.raffle.find({"$or" : [{"ticket_no" : 725},{"winner" : true}]})
二者結合使用:
>db.raffle.find({"$or" : [{"ticket_no" : {"$in" : [725,542,300]}},{"winner" : true}]})
$not
"$not"是元條件句,便可以在任何其餘條件之上。
"$mod"經過傳入兩個參數,第一個用來做爲除數,第二個是用來斷定餘數是否爲此數字
>db.user.find({"id_num" : {"$not" : {"$mod" : [5,1]}}})
null
null不只會匹配某個鍵的值爲null的文檔,並且還匹配不包含這個鍵的文檔
>db.c.find({"z" : null})
若是僅僅想匹配鍵值爲null的文檔,則能夠加"$exists"條件:
>db.c.find({"z" : {"$in" : [null], "$exists" : true}})
正則表達式
>db.users.find({"name" : /joey?/i})
查詢數組
$all,能夠用來進行多個元素匹配數組
//這樣查找就能夠匹配到同時存在的兩個元素的文檔 >db.food.find({"fruit" : {"$all" : ["people","banana"]}})
$size用來查詢特定長度的數組
>db.food.find({"furit" : {"$size" : 3}})
$slice用來返回某個匹配數組元素的一個子集
//返回前十條評論,若是把10換成-10就是返回後十條評論 >db.blog.posts.findOne(criteria,{"comments" : {"$slice" : 10}}) //這個操做會跳過前面23個元素,返回第24~33個元素 >db.blog.posts.findOne(criteria,{"comments" : {"$slice" : [23,10]}})
返回一個匹配的數組元素
>db.blog.find({"comments.name" : "bob"}, {"comments.$" : 1}) //返回結果 { "id" : ObjectId("..."), "comments" : [ { "name" : "bob", "email" : "bob@example.com", "content" : "good post" } ] } //這樣就只會返回第一條評論
查詢內嵌文檔
如今有這樣的數據
{ "name": { "first":"joe", "last":"Schmoe" }, "age":45 }
對內嵌文檔的查詢
//用點表示法表達"進入內嵌文檔內部"的意思 >db.people.find({"name.first" : "joe" ,"name.last" : "Schmoe"})
要正確指定一組條件,而沒必要指定每一個鍵,就須要使用"$elematch"
>db.blog.find({"comments" : {$elematch" : {"author" : "joe", "score" : {"$gte" : 5}}}})
遊標查詢的具體操做:
>for(i = 0; i <100; i ++) { db.collection.insert({x : i}); } >var cursor = db.collection.find(); >while(cursor.hasNext()) { obj = cursor.next(); //輸出查看 } ###limit,skip,和sort >db.c.find().limit(3) >db.c.find().skip(3)