Spring Data Mongodb的API及案例(exists、gt、in、is、orOperator 、regex、size)


 

Criteria提供的以下方法,這些方法都對應着MongoDB中的運算符,所有的方法返回值依舊是Criteria類。

1. exists條件的使用

推薦閱讀—MongoDB操作符$exists

  1. 當boolean為true,$exists匹配包含字段的文檔,包含字段為null的文檔。
  2. 當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") }
    ]);

案例:篩選itemabc或者 price20的文檔。

    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的格式,來進行處理。


推薦閱讀

Java中正則表達式(regex)匹配多行(Pattern.MULTILINE和Pattern.DOTALL模式)

MongoDB小結16 - find【查詢條件$in】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM