網頁

2019/8/10

MongoDB 查詢資料邏輯運算子語法範例

本篇簡單介紹在MongoDB查詢資料時如何使用邏輯運算子(Logical Query Operators)來篩選查詢資料的語法。

本範例會使用到比較運算子(Comparison Query Operators),請參考MongoDB 查詢資料比較運算子語法範例

在MongoDB建立資料請參考MongoDB 使用mongo shell新增多筆資料

members集合建立一些資料如下:

{ "_id" : ObjectId("5d4e5fb28ef1d4239e23e5b3"), "name" : "王大明", "age" : 26 }
{ "_id" : ObjectId("5d4e5fb28ef1d4239e23e5b4"), "name" : "黃小玉", "age" : 19 }
{ "_id" : ObjectId("5d4e5fb28ef1d4239e23e5b5"), "name" : "李小芳", "age" : 23 }
{ "_id" : ObjectId("5d4ee49aa2f6bbafe52339b9"), "name" : "陳大樹", "age" : 29, "level" : 19 }
{ "_id" : ObjectId("5d4ee49aa2f6bbafe52339ba"), "name" : "林大為", "age" : 32, "level" : 22 }
{ "_id" : ObjectId("5d4ee49aa2f6bbafe52339bb"), "name" : "蔡小芬", "age" : 16, "level" : 25 }

查詢資料使用db.collection.find()collection為要查詢的Collection名稱,本範例為members


AND

使用$and返回同時滿足兩邊條件的查詢結果。

例如找出age > 20level > 20的資料。

> db.members.find({ $and: [ { age: { $gt: 20 } }, { level: { $gt: 20 } } ] })
{ "_id" : ObjectId("5d4ee49aa2f6bbafe52339ba"), "name" : "林大為", "age" : 32, "level" : 22 }

效果類似SQL的SELECT * FROM members WHERE age > 20 AND level > 20;


OR

使用$or返回滿足兩邊任一條件的查詢結果。

例如找出age < 20level > 20的資料。

> db.members.find({ $or: [ { age: { $lt: 20 } }, { level: { $gt: 20 } } ] })
{ "_id" : ObjectId("5d4e5fb28ef1d4239e23e5b4"), "name" : "黃小玉", "age" : 19 }
{ "_id" : ObjectId("5d4ee49aa2f6bbafe52339ba"), "name" : "林大為", "age" : 32, "level" : 22 }
{ "_id" : ObjectId("5d4ee49aa2f6bbafe52339bb"), "name" : "蔡小芬", "age" : 16, "level" : 25 }

效果類似SQL的SELECT * FROM members WHERE age < 20 OR level > 20;


NOT

使用$not返回不滿足條件的查詢結果。

例如找出age 不小於 30的資料。

> db.members.find({ age: { $not: { $lt: 30 } } })
{ "_id" : ObjectId("5d4ee49aa2f6bbafe52339ba"), "name" : "林大為", "age" : 32, "level" : 22 }

NOR

使用$nor返回不滿足兩邊任一條件的查詢結果。

例如找出不滿足age < 20level > 20的資料。

> db.members.find({ $nor: [ { age: { $lt: 20 } }, { level: { $gt: 20 } } ] })
{ "_id" : ObjectId("5d4e5fb28ef1d4239e23e5b3"), "name" : "王大明", "age" : 26 }
{ "_id" : ObjectId("5d4e5fb28ef1d4239e23e5b5"), "name" : "李小芳", "age" : 23 }
{ "_id" : ObjectId("5d4ee49aa2f6bbafe52339b9"), "name" : "陳大樹", "age" : 29, "level" : 19 }


綜合

使用$or$and找出(age < 20level > 20)或(age > 30level > 20)的資料。

> db.members.find( { $or: [
    { $and: [ { age: { $lt: 20 } }, { level: { $gt: 20 } } ] },
    { $and: [ { age: { $gt: 30 } }, { level: { $gt: 20 } } ] }
] } )
{ "_id" : ObjectId("5d4ee49aa2f6bbafe52339ba"), "name" : "林大為", "age" : 32, "level" : 22 }
{ "_id" : ObjectId("5d4ee49aa2f6bbafe52339bb"), "name" : "蔡小芬", "age" : 16, "level" : 25 }

參考:

沒有留言:

張貼留言