練習
我們將使用 MongoDB 官方提供的一個 restaurants 範例資料庫來進行練習。
為了讓大家有語法的提示可以練習,建議安裝 NoSQL Booster for MongoDB 這套工具
這套工具具有語法高亮、檢查的功能,至少可以讓自己慢慢習慣 MongoDB 的查詢語法
稍微讓大家看一下 restaurants 中的一個 document 大概會有什麼欄位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| { "_id" : ObjectId("5adb3e64cff73e287484d1c2"), "address" : { "building" : "469", "coord" : [ -73.961704, 40.662942 ], "street" : "Flatbush Avenue", "zipcode" : "11225" }, "borough" : "Brooklyn", "cuisine" : "Hamburgers", "grades" : [ { "date" : ISODate("2014-12-30T08:00:00.000+08:00"), "grade" : "A", "score" : 8 }, { "date" : ISODate("2014-07-01T08:00:00.000+08:00"), "grade" : "B", "score" : 23 }, { "date" : ISODate("2013-04-30T08:00:00.000+08:00"), "grade" : "A", "score" : 12 }, { "date" : ISODate("2012-05-08T08:00:00.000+08:00"), "grade" : "A", "score" : 12 } ], "name" : "Wendy'S", "restaurant_id" : "30112340" }
|
$eq, $ne
相等、不相等
語法結構
1 2
| { <field>: { $eq: <value> } } { <field>: { $ne: <value> } }
|
如果你要明確比對某一個欄位的值,可以這樣寫
1 2 3
| db.restaurants.find({ "borough": { "$eq": "Brooklyn" } })
|
但是以上語法也等於這段語法
1 2 3
| db.restaurants.find({ "borough": "Brooklyn" })
|
他也可以比對像是 grades 陣列中的屬性,我們嘗試著找出所有 grade 包含 A 的 restaurants 時,語法可以這樣下
1 2 3
| db.restaurants.find({ "grades.grade": { "$eq": "A" } })
|
但是因為他一次查詢是以一個 collection 為單位,所以他會返回所有符合條件的 restaurant。
$gt, $gte, $lt, $lte
大於、大於等於、小於、小於等於
語法結構
1 2 3 4
| { field: { $gt: value }} { field: { $gte: value }} { field: { $lt: value }} { field: { $lte: value }}
|
我們可以嘗試著找出 grades 中 score 小於等於 2 的 restaurants
1 2 3
| db.restaurants.find({ "grades.score": { "$lte": 2 } })
|
因為這些語法結構相類似,所以大家可以搭配自己的需求運用,不再一一示範
$in, $nin
在或不在 集合當中
語法結構
1 2
| { field: { $in: [<value1>, <value2>, ... <valueN> ]} } { field: { $nin: [<value1>, <value2> ... <valueN> ]} }
|
嘗試著找出 score 不在 11, 12 中的所有 restaurants
1 2 3
| db.restaurants.find({ "grades.score": { "$nin": [11, 12] } })
|
參考資料