MongoDB生命令CURD

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

《MongoDB權威指南》學習摘錄

Insert

使用insert方法

該操作文件會自動生成一個”_id”鍵

>db.foo.insert({“bar” : “baz”})

批量插入,使用batchInsert函式

>db.foo.batchInsert([{ "_id" : 0 } , { "_id" : 1 } , { "_id" : 2 }])

當前mongodb能接受的最大訊息長度是48MB,並且如果在執行批量插入過程中有一個文件插入失敗,則在該文件之前的所有文件都會成功插入到集合中,而這個文件之後的所有文件全部插入失敗。

Remove

使用remove方法

//刪除foo集合的所有文件
>db.foo.remove()
//刪除指定查詢文件作為可選引數
>db.mailing.list.remove( { “opt-out” : true } )

使用drop()比直接刪除集合會更快

>db.foo.drop()

Update

文件替換

{
"_id": ObjectId("..."),
"name": "joe",
"friends": 32,
"enemies": 2
}

現在需要更新”friends”和”enemies”兩個欄位到”relationships”子文件中


>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);

更新後的文件

{
"_id":ObjectId("..."),
"username":"joe",
"relationships":{
"friends":32,
"enemies":2
}
}

常見的錯誤是查詢條件匹配到多個文件,然後更新的時候回由於第二個引數的存在就產生重複的”_id”值,對於這種情況要使用”_id”值來進行查詢

使用修改器

“$inc”修改器使用

當有人訪問頁面的時候,就通過url找到該頁面,然後使用”$inc”修改器增加”pagerviews”的值

{
"_id":ObjectId("..."),
"url":"www.lgybetter.com",
"pagerviews":52
}

>db.analytics.update({"url":"www.lgybetter.com"},{"$inc" : {"pagerviews" : 1}})

注意,使用修改器時,”_id”並不會改變,而文件替換過則會

“$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" : "[email protected]","content":"nice post."}
}})
>db.blog.posts.findOne()
{
"_id":ObjectId("..."),
"title":"A blog post",
"content":"...",
"comments": [
{
"name":"joe",
"email":"[email protected]",
"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" :
["[email protected]","[email protected]","[email protected]"]
}}
})

使用”$pop”刪除陣列元素{“$pop” : {“key” : 1}}從陣列末尾刪除,{“$pop” : {“key” : -1}}從陣列頭部刪除

使用”$pull”刪除元素

>db.lists.update({},{"$pull" : {"todo" : "laundry"}})

使用upsert

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
}    

Find

find入門操作

查詢該集合下的所有文件

>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":"[email protected]"
}

通過查詢,預設情況下回返回”_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" : "[email protected]",
"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)

相關文章

伺服器 最新文章