本文結構
$all : 匹配指定內容
$mod:取MOD後查詢
$size:取得node數量、長度
$type :指定資料的類型來查詢
$elemMatch : 資料符合查詢
$slice :針對array 元素進行切片操作
limit() 限制取得資料數量、skip() 跳過多少筆資料
教程視頻:將於1/30日晚間發佈視頻。
原發佈網址:http://mongodbcanred.blogspot.tw/2015/01/6mongodb2.html
在MongoDB的條件操作符(1)介紹已經提出許多操作能力,但是好像還沒有介紹完成,所以在本文中主要補允未說明的指令為主。
在操作之前我需要為大家先準備好一些資料,以便後續的操作又及理解。
建立一個 Collection 名為 bookStore (書店)
1.先切換到 mydb 資料庫
use mydb
2.執行資料插入
db.bookStore.insert([{
name: "storeA",
books: ["小說", "漫書", "商業期刊", "雜誌"],
startYear: 2015,
region: "台北"
}, {
name: "storeB",
books: ["商業期刊", "漫書", "雜誌"],
startYear: 2015,
region: "台北"
}, {
name: "storeC",
books: ["雜誌", "商業期刊"],
startYear: 2015,
region: "新竹"
}, {
name: "storeD",
books: ["小說", "漫書", "商業期刊", "雜誌"],
startYear: 2012,
region: "新竹"
}, {
name: "storeE",
books: ["商業期刊", "雜誌"],
startYear: 2011,
region: "台中"
}, {
name: "storeF",
books: ["漫書", "商業期刊"],
startYear: 2014,
region: "台中"
}, {
name: 123,
books: ["漫書", "商業期刊"],
startYear: 2014,
region: "台中"
}])
3.驗証一下資料是否存在
db.bookStore.find().count()
是不是輸出有7筆資料。
現在我們的資料已經準備好了,就可以來練習find的語法。
$all : 匹配指定內容
比如說我們要找那些書店 有賣"商業期刊"而且也有"漫書" ?
db.bookStore.find({
books: {
$all: ["商業期刊", "漫書"]
}
}).count()
返回5筆資料
與下段程式是功能是相同的
db.bookStore.find({
$and: [{
books: {
$in: ["漫書"]
}
}, {
books: {
$in: ["商業期刊"]
}
}]
}).count()
返回5筆資料
但是我們在下語句,常常下成這樣,看似相同但是結果大不同,因為以下的
語句返回了 7 筆資料…,這是因為 他的查詢方式有關。
db.bookStore.find({
books: {
$in: ["漫書","商業期刊"]
}
}).count()
返回7筆資料
$mod:取MOD後查詢
說白話點就是先經由 取餘運算之後的結果 再來查詢啦!
以下語句是用來查找startYear 除 10 後等於1的資料。
db.bookStore.find({
startYear: {
$mod: [10, 1]
}
})
$size:取得node數量、長度
以下語句是用來 查找只賣2書籍的書店有幾家?
db.bookStore.find({
books: {
$size: 2
}
})
$type :指定資料的類型來查詢
以下語句是用來 查詢 name 欄位型別為 double 的書店?
db.bookStore.find({
name: {
$type: 1
}
})
type對應類型表如下:
$elemMatch : 資料符合查詢
在練習elemMatch指令之前我們需要先修改一下原來的資料,為每一間書店加上店員資訊。
這邊將使用到 更新操作符 $SET , 這次最主要是更新新增一個欄位為 employee 表示店員資訊;而employee 是一個Array,儲存著店員相關資料(name,age,salary)。
簡單的來說 elemMatch指令 是可以對內含的對象再進行條件查詢使用的。
以下是更新語句
db.bookStore.update({name:"storeA"},{
$set:{
employee:[
{name:'小王',age:18,salary:100},
{name:'小李',age:19,salary:110}
]
}
});
db.bookStore.update({name:"storeB"},{
$set:{
employee:[
{name:'小陳',age:20,salary:100},
{name:'小劉',age:21,salary:110}
]
}
});
db.bookStore.update({name:"storeC"},{
$set:{
employee:[
{name:'小一',age:22,salary:100},
{name:'小二',age:21,salary:110}
]
}
});
db.bookStore.update({name:"storeD"},{
$set:{
employee:[
{name:'張三',age:23,salary:100},
{name:'李四',age:25,salary:110}
]
}
});
db.bookStore.update({name:"storeE"},{
$set:{
employee:[
{name:'老王',age:24,salary:100},
{name:'趙六',age:23,salary:110}
]
}
});
db.bookStore.update({name:"storeF"},{
$set:{
employee:[
{name:'王九',age:26,salary:100},
{name:'黃十',age:18,salary:110}
]
}
});
db.bookStore.update({name:123},{
$set:{
employee:[
{name:'大王',age:31,salary:100},
{name:'大李',age:20,salary:110}
]
}
});
我們現在需要查出那一個書店有18歲的店員,可以使用下列語句
db.bookStore.find({
employee:{
$elemMatch:{
age:18
}
}
})
我們現在需要查出那一個書店的店員年齡大於等於30歲,可以使用下列語句
db.bookStore.find({
employee:{
$elemMatch:{
age:{ $gte:30 }
}
}
})
$slice :針對array 元素進行切片操作
取得所有書店的第一本書
db.bookStore.find({}, {
books: {
$slice: [1, 1]
},
_id: 0,
name: 1
}).pretty()
執行結果
limit() 限制取得資料數量、skip() 跳過多少筆資料
一般來說功能用來實現分頁的功能,因為這一個功能比較easy…
大家直接看執行語句與執行結果就可以了解。
1.首先執行
db.bookStore.find({}, {
name: 1,
_id: 0
})
執行結果:查到7筆資料
2.使用skip指令
db.bookStore.find({}, {
name: 1,
_id: 0
}).skip(1)
執行結果:查到6筆資料
3.使用limit指令(限制資料量)
db.bookStore.find({}, {
name: 1,
_id: 0
}).skip(1).limit(2)
執行結果:查到2筆資料
下節教程內容為 MongoDB 的條件操作符(3)就是進階的查詢 ^ ^
建議,可以的話,更換一下字型,別再沿用新細明體了,{} <> 的可讀性很差.
下面URL可以參考一下.
http://www.howtogeek.com/howto/windows-vista/stupid-geek-tricks-enable-more-fonts-for-the-windows-command-prompt/
http://www.wikihow.com/Customize-the-Font-in-Windows-Command-Prompt
好的…我下次發文的時侯會特別的注意一下 ^ ^ , 謝謝啦!