Criteria提供的以下方法,這些方法都對應着MongoDB中的運算符,所有的方法返回值依舊是Criteria類。
1. exists條件的使用
推薦閱讀—MongoDB操作符$exists
- 當boolean為true,
$exists匹配包含字段的文檔,包含字段為null的文檔。 - 當boolean為false,
$exists返回不包含字段的文檔。
db.testelemMatch3.insert([
{"find": "project1","tags": [{"key": "area", "value": "IT"},{"key": "department", "value": "Architecture"}]},
{"find": "project2","tags": [{"key": "area", "value": "HR"},{"key": "department", "value": "IT"}]}
])
public static void find9() { Criteria criteria = Criteria.where("key").exists(true); Query query = Query.query(criteria); log.info("流程:{}", query); List<BasicDBObject> basicDBObjects = mongoTemplate.find(query, BasicDBObject.class, "testelemMatch3"); log.info("最終數據{}", JSON.toJSONString(basicDBObjects)); }
生成的原生語句:
{ "key" : { "$exists" : true} }
因為使用了exists=true,若文檔中不包含key字段,那么最終返回的數據為[]。
2. 比較運算符的使用
| 符號 | 描述 |
|---|---|
| gt | 大於 |
| gte | 大於等於 |
| lt | 小於 |
| lte | 小於等於 |
案例一:篩選成績是(90,100)的文檔
db.stus.insert([
{ "_id" : ObjectId("5e64bf9a2a16affa306b8b93"), "name" : "數組1", "age" : "18","gender" : "男","scope" : 77.0},
{"_id" : ObjectId("5e64cc2b6ef8da42f1854b11"), "name" : "數組2","age" : "13", "gender" : "女","scope" : 89},
{ "_id" : ObjectId("5e663e7379bbd40eb81de8eb"),"name" : "數組3","age" : "13","gender" : "男","scope" : 60},
{"_id" : ObjectId("5e6648d179bbd40eb81de8ee"),"name" : "數組4","age" : "14","gender" : "男","scope" : 59},
{"_id" : ObjectId("5e6648d479bbd40eb81de8f0"),"name" : "數組5","age" : "18","gender" : "男","scope" : 68},
{"_id" : ObjectId("5e6648d879bbd40eb81de8f1"),"name" : "數組6","age" : "24","gender" : "男","scope" : 56},
{"_id" : ObjectId("5e6648d979bbd40eb81de8f2"),"name" : "數組7","age" : "25","gender" : "女", "scope" : 90},
{ "_id" : ObjectId("5e6648d979bbd40eb81de8f3"),"name" : "數組8","age" : "24","gender" : "男","scope" : 98},
{ "_id" : ObjectId("5e6648d979bbd40eb81de8f4"),"name" : "數組9", "age" : "18","gender" : "男","scope" : 45},
{ "_id" : ObjectId("5e6648d979bbd40eb81de8f5"),"name" : "數組10", "age" : "14", "gender" : "女", "scope" : 67}
]);
public static void find9() { Criteria criteria = Criteria.where("scope").gt(90).lt(100); Query query = Query.query(criteria); log.info("流程:{}", query); List<BasicDBObject> basicDBObjects = mongoTemplate.find(query, BasicDBObject.class, "stus"); log.info("最終數據{}", JSON.toJSONString(basicDBObjects)); }
生成的原生語句:
{ "scope" : { "$gt" : 90, "$lt" : 100 } }
生成結果:
[{"_id":{"counter":1960179,"date":1583761625000,"machineIdentifier":7977940,"processIdentifier":3768,"time":1583761625000,"timeSecond":1583761625,"timestamp":1583761625},"name":"數組8","age":"24","gender":"男","scope":98}]
案例二:篩選文檔內聯數組中元素符合大於80小於90的文檔。
db.testelemMatch.insert([
{ "name" :"數組1" , "score" : [70.0 , 80.0 , 100.0]},
{ "name" :"數組2" , "score" : [ 120.0 , 60.0]},
{ "name" :"數組2" , "score" : [ 88.0 , 99.0]},
{ "name" :"數組2" , "score" : [ 18.0 , 59.0]},
{ "name" :"數組2" , "score" : [ 28.0 , 79.0]},
{ "name" :"數組3" , "score" : [ 48.0 , 89.0]}
])
可以看到where條件填寫的是$gt,並沒有使用gt()方法。注意使用的是elemMatch操作符,使得至少有一個元素完全符合(80,90)的條件。
Criteria c1 = Criteria.where("$gt").is(80).and("$lt").is(90); Query query = new Query(Criteria.where("score").elemMatch(c1)); //映射關系,該元素會被映射。 query.fields().include("score");
生成的原生語句。
{ "score" : { "$elemMatch" : { "$gt" : 80, "$lt" : 90 } } }
3. in操作符的使用
in可參考sql中的in,即可匹配多個條件。
public static void find9() { // List<String> data = new ArrayList<>(); // data.add("數組1"); // data.add("數組2"); // Criteria criteria = Criteria.where("name").in(data); //處理數據 Criteria criteria = Criteria.where("name").in("數組1", "數組2"); Query query = Query.query(criteria); log.info("流程:{}", query); List<BasicDBObject> basicDBObjects = mongoTemplate.find(query, BasicDBObject.class, "testelemMatch"); log.info("最終數據{}", JSON.toJSONString(basicDBObjects)); }
輸出的原生語句:
{ "name" : { "$in" : ["數組1", "數組2"] } }
4. is方法
使用字段匹配({key:value}),is()中的參數是value值。
public static void find9() { Criteria criteria = Criteria.where("name").is("數組1"); Query query = Query.query(criteria); log.info("流程:{}", query); List<BasicDBObject> basicDBObjects = mongoTemplate.find(query, BasicDBObject.class, "testelemMatch"); log.info("最終數據{}", JSON.toJSONString(basicDBObjects)); }
輸出的原生語句:
{ "name" : "數組1" }
5. orOperator — 或者
相當於or的作用。
db.items.insert([
{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-03-01T08:00:00Z") },
{ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-03-01T09:00:00Z") },
{ "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-03-15T09:00:00Z") },
{ "_id" : 4, "item" : "xyz", "price" : 5, "quantity" : 20, "date" : ISODate("2014-04-04T11:21:39.736Z") },
{ "_id" : 5, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-04-04T21:23:13.331Z") }
]);
案例:篩選item為abc或者 price為20的文檔。
public static void find9() { //注:Criteria.where("item")方法實際上執行的是return new Criteria(key); //也可以使用無參的構造方法 Criteria criteria = new Criteria().orOperator( Criteria.where("item").is("abc"), Criteria.where("price").is(20) ); Query query = Query.query(criteria); log.info("流程:{}", query); List<BasicDBObject> basicDBObjects = mongoTemplate.find(query, BasicDBObject.class, "items"); log.info("最終數據{}", JSON.toJSONString(basicDBObjects)); }
輸出的原生語句:
{ "$or" : [{ "item" : "abc" }, { "price" : 20 }] }
輸出結果:
[{"_id":1,"item":"abc","price":10,"quantity":2,"date":1393660800000}, {"_id":2,"item":"jkl","price":20,"quantity":1,"date":1393664400000}, {"_id":5,"item":"abc","price":10,"quantity":10,"date":1396646593331}]
案例二—Spring整合MongoDB實現多個or的范圍查詢
6. regex 正則
public static void find9() { Criteria criteria=new Criteria(); //傳入的條件 String keyword="a"; //Pattern.CASE_INSENSITIVE 啟用不區分大小寫的正則表達。 Pattern pattern = Pattern.compile("^.*" + keyword + ".*$", Pattern.CASE_INSENSITIVE); criteria.and("item").regex(pattern); Query query = Query.query(criteria); log.info("流程:{}", query); List<BasicDBObject> basicDBObjects = mongoTemplate.find(query, BasicDBObject.class, "items"); log.info("最終數據{}", JSON.toJSONString(basicDBObjects)); }
輸出的原生語句:
{ "item" : { "$regex" : "^.*a.*$", "$options" : "i" }
7. size — 獲取指定數組長度的文檔
輸出數組長度為3的文檔。
public static void find9() { Criteria criteria=new Criteria(); //尋找數組長度3的文檔。 criteria.and("score").size(3); Query query = Query.query(criteria); log.info("流程:{}", query); List<BasicDBObject> basicDBObjects = mongoTemplate.find(query, BasicDBObject.class, "testelemMatch"); log.info("最終數據{}", JSON.toJSONString(basicDBObjects)); }
輸出的原生語句:
{ "score" : { "$size" : 3 } }
輸出結果:
[{"_id":{"counter":4946571,"date":1583927738000,"machineIdentifier":2016652,"processIdentifier":-15175,"time":1583927738000,"timeSecond":1583927738,"timestamp":1583927738},"name":"數組1","score":[70,80,100]}]
8. 判斷mongo屬性存在性
db.getCollection('collect0').find({'lat':{'$exists': 'True'}})
利用這個句柄,會得到類似可以for i in cursor的格式,來進行處理。
