MongoDB 語法注意事項 -1

這邊提幾個基本的查詢容易犯得錯,之後再追加比較進階的部分。

  • 只是要確認存在,讓DB只回覆 _id,不需要整個回覆

常見的

1
2
3
4
db.users.findOne({
'username' : 'pattri'
'pwd' : 'iampass123'
})

其實只要回覆 _id,這樣可以提高傳輸效率

1
2
3
4
db.users.findOne({
'username' : 'pattri'
'pwd' : 'iampass123'
}, { '_id':1 } )
  • 重複用運算子搜索同一個欄位

1
2
3
4
db.users.find({
{ 'age': {'$gte': 30} ,
{ 'age': {'$lte': 40} ,
} )

正確的應該是

1
2
3
db.users.find({
'age': {'$gte': 30, '$lte': 40}
} )
  • 使用 $nin 效率會比 $in 來得高

  • 子查詢的順序是有差別的

Sample:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"_id" : ObjectId("5cb4a9226820f1f878f93d82"),
"key" : "key.1",
"localization" : [
{
"langCode" : "en-gb",
"displayValue" : "display_en-gb.1"
},
{
"langCode" : "zh-tw",
"displayValue" : "display_zh-tw.1"
}
]
}

若按順序搜尋 langCode 、 displayValue 的話,可以找到結果

1
2
3
4
5
6
db.col.find({
'localization' :
{
'langCode' : 'en-gb' , 'displayValue' : 'display_en-gb.1'
}
})

若沒有按順序搜尋,先查找 displayValue 再 langCode 則會找不到資料!!

1
2
3
4
5
6
db.col.find({
'localization' :
{
'displayValue' : 'display_en-gb.1', 'langCode' : 'en-gb'
}
})
  • 子文件查詢,查出符合的項目

這個不是注意事項,是留個語法,不過要特別注意子文件查詢的效能。

Sample:

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
{
"_id" : ObjectId("5cb4a9226820f1f878f93d82"),
"key" : "key.1",
"localization" : [
{
"langCode" : "en-gb",
"displayValue" : "display_en-gb.1"
},
{
"langCode" : "zh-tw",
"displayValue" : "display_zh-tw.1"
}
]
},
{
"_id" : ObjectId("5cb4a9226820f1f878f93d88"),
"key" : "key.2",
"localization" : [
{
"langCode" : "en-gb",
"displayValue" : "display_en-gb.2"
},
{
"langCode" : "zh-tw",
"displayValue" : "display_zh-tw.2"
}
]
}

如果想找出 langCode = ‘en-gb’ 的所有 displayValue 組合,可以這樣做:

1
2
3
4
db.col.find(
{'localization.langCode' : 'en-gb'},
{'localization.$' : 1}
)

這樣zh-tw的內容就不會出現了,結果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"_id" : ObjectId("5cb4a9226820f1f878f93d82"),
"localization" : [
{
"langCode" : "en-gb",
"displayValue" : "display_en-gb.1"
}
]
}
{
"_id" : ObjectId("5cb4a9226820f1f878f93d88"),
"localization" : [
{
"langCode" : "en-gb",
"displayValue" : "display_en-gb.2"
}
]
}