spring data mongodb的mongotemplt使用示例

前言

Spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,本文章是mongodb的原生查询语法和spring的MongoTemplate对比讲解的.所用对Mongodb原生的增删改查要有一定的了解

数据库结构( User 集合样例)

{
   "_id" : "5a0e6d48498eac55eb8bf0a4", 
    "nickname":"轩哥",
    "name":"水车",
    "age":20,
    "work":"programmer"
    "girlfriend":{
        name:"如花",
        age:40,
        work:"noJob"
    },
    "boyfriend"[
        {
            name:"狗蛋",
            age:18,
            Intimacy:99
        },
        {
            name:"麻子",
            age:21,
            Intimacy:88
        }
    ],
    playGame:["dnf","英雄联盟","绝地求生"]
},
......

我们会对类似以上的集合进行查询

查询

本地创建好类似的model,我定义的model叫MongoUser.java

query查询语句的实现的方式有两种:

方法一: org.springframework.data.mongodb.core.query

语法:

Query (Criteria criteria)  // (构造函数)

接受的参数是org.springframework.data.mongodb.core.query.Criteria

Criteria是标准查询的接口,可以引用静态的Criteria.where的把多个条件组合在一起,就可以轻松地将多个方法标准和查询连接起来

示例1: 查询名字叫”水车”的 一条 信息
如果是多条信息,用find(),但是用find的时候返回的是一个集合,所以在JAVA中就不能用对象去接了,而是要用List(数组)

#mongodb语法
db.User.findOne({"name":"水车"})

#java写法1
Query query = new Query();
query.addCriteria(new Criteria("name").is("水车"));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);

#java写法2
Query query = new Query();
query.addCriteria(Criteria.where("name").is("水车"));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);

#java写法3
Query query = new Query(Criteria.where("name").is("水车"));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);

示例2: 查询名字叫”水车”的,并且年龄是20岁的 一条 信息
如果是多条信息,用find()

#mongodb语法
db.User.findOne({"name":"水车","age":20})

#java写法1
Query query = new Query();
query.addCriteria(new Criteria("name").is("水车"));
query.addCriteria(new Criteria("age").is(20));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);

#java写法2
Query query = new Query();
query.addCriteria(Criteria.where("name").is("水车").and("age").is(20));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);

#java写法3
Query query = new Query(Criteria.where("name").is("水车").and("age").is(20));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);

示例3: 查询名字叫”水车”的或者是绰号叫”轩哥”的 一条 信息
如果是多条信息,用find()

#mongodb语法
db.User.findOne({"$or":[{"name":"水车"},{"nickname":"轩哥"}]})

#java写法
Query query = new Query();
query.addCriteria(new Criteria().orOperator(Criteria.where("name").is("水车"), Criteria.where("nickname").is("轩哥")));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);

示例4: 查询名字叫”水车”的年龄是20的 或者 是绰号叫”轩哥”的,年龄是20的 一条 信息
如果是多条信息,用find()

#mongodb语法
db.User.findOne({"$or":[{"name":"水车","age":20},{"nickname":"轩哥","age":20}]})

#java写法
//orOperator(参数1, 参数2, ...)
Query query = new Query();
query.addCriteria(new Criteria().orOperator(Criteria.where("name").is("水车").and("age").is(20), Criteria.where("nickname").is("轩哥").and("age").is(20)));
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);

示例5: 查询名字叫”水车”的或者叫”张三”的或者叫”李四”的或者叫”王麻子的” 信息

#mongodb语法
db.User.find({"name":{"$in":["水车","张三","李四","王麻子"]})

#java写法1
Query query = new Query();
String[] nameStr = {"水车","张三","李四","王麻子"}
query.addCriteria(new Criteria("name").in(nameStr));
List<MongoUser> user = this.mongoTemplate.findOne(query, MongoUser.class);

#java写法2
Query query = new Query();
String[] nameStr = {"水车","张三","李四","王麻子"}
query.addCriteria(Criteria.where("name").in(nameStr));
List<MongoUser> user = this.mongoTemplate.findOne(query, MongoUser.class);

示例6: 查询 年龄大于20岁 小于30岁的人 信息

#mongodb语法
db.User.find({"age":{"$gt":20,"$lt":30]})

#java写法
Query query = new Query();
query.addCriteria(Criteria.where("age").gt(20).lt(30);
List<MongoUser> user = this.mongoTemplate.findOne(query, MongoUser.class);

简单示例就到此为止下面是列出的Criteria可以接的一些方法和对应的mongodb方法

CriteriaMongodb说明备注
Criteria and (String key)$and并且
Criteria andOperator (Criteria…​ criteria)$and并且
Criteria orOperator (Criteria…​ criteria)$or或者
Criteria gt (Object o)$gt大于
Criteria gte (Object o)$gte大于等于
Criteria in (Object…​ o)$in包含可以是一个数组
Criteria is (Object o)$is等于
Criteria lt (Object o)$lt小于
Criteria lte (Object o)$lte小等于
Criteria nin (Object…​ o)$nin不包含可以是一个数组

稍复杂的查询
示例7: 查询 女朋友的name叫如花的一条信息

#mongodb语法
db.User.findOne({"girlfriend.name":"如花")

#java写法
Query query = new Query();
query.addCriteria(Criteria.where("girlfriend.$.name").is("如花");
MongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);

示例8: 查询 name中包含”轩” 这一个字的 多条信息 –模糊查询

#mongodb语法
...
new Query(),

#java写法
Query query = new Query();
query.addCriteria(Criteria.where("name").regex("轩");
List<MongoUser> user = this.mongoTemplate.findOne(query, MongoUser.class);

示例9: 查询 数组中数量是3的信息 –模糊查询

#mongodb语法
...
new Query(),

#java写法
Query query = new Query();
query.addCriteria(Criteria.where("boyfriend").size(3);
ListMongoUser user = this.mongoTemplate.findOne(query, MongoUser.class);

方法二: org.springframework.data.mongodb.core.query.BasicQuery

持续更新中…

    原文作者:水车306
    原文地址: https://www.jianshu.com/p/60c93001173f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞