MongoDB - 比較查詢運算子 Comparison Query Operators

Posted by Ryan Tseng on 2018-04-22

練習

我們將使用 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] }
})

參考資料