设为首页 收藏本站
查看: 1437|回复: 0

[经验分享] Mongodb与spring集成(1)------配置

[复制链接]
发表于 2018-10-26 13:31:03 | 显示全部楼层 |阅读模式
  Mongodb与spring集成(1)------配置
  这里我们用到的是spring-data中一个集成mongodb的项目,首先在maven中添加对它的依赖,这里我用的是1.0.0.M5版本
  
  
  org.springframework.data
  spring-data-mongodb
  1.0.0.M5
  
  然后是配置文件
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  
  这样基本配置就完成了,其它深入操作将在后续文章中说明。
  spring-data-mongodb中的实体映射是通过
  MongoMappingConverter这个类实现的。它可以通过注释把
  java类转换为mongodb的文档。
  它有以下几种注释:
  @Id - 文档的唯一标识,在mongodb中为ObjectId,它是唯一的,通过时间戳+机器标识+进程ID+自增计数器(确保同一秒内产生的Id不会冲突)构成。
  @Document - 把一个java类声明为mongodb的文档,可以通
  过collection参数指定这个类对应的文档。
  @DBRef - 声明类似于关系数据库的关联关系。ps:暂不支持级联的保存功能,当你在本实例中修改了DERef对象里面的值时,单独保存本实例并不能保存DERef引用的对象,它要另外保存,如下面例子的Person和Account。
  @Indexed - 声明该字段需要索引,建索引可以大大的提高查询效率。
  @CompoundIndex - 复合索引的声明,建复合索引可以有效地提高多字段的查询效率。
  @GeoSpatialIndexed - 声明该字段为地理信息的索引。
  @Transient - 映射忽略的字段,该字段不会保存到
  mongodb。
  @PersistenceConstructor - 声明构造函数,作用是把从数据库取出的数据实例化为对象。该构造函数传入的值为从DBObject中取出的数据。
  以下引用一个官方文档的例子:
  Person类
  @Document(collection="person")
  @CompoundIndexes({
  @CompoundIndex(name = "age_idx", def = "{'lastName': 1, 'age': -1}")
  })
  public class Person {
  @Id
  private String id;
  @Indexed(unique = true)
  private Integer ssn;
  private String firstName;
  @Indexed
  private String lastName;
  private Integer age;
  @Transient
  private Integer accountTotal;
  @DBRef
  private List accounts;
  private T address;
  public Person(Integer ssn) {
  this.ssn = ssn;
  }
  @PersistenceConstructor
  public Person(Integer ssn, String firstName, String lastName, Integer age, T address) {
  this.ssn = ssn;
  this.firstName = firstName;
  this.lastName = lastName;
  this.age = age;
  this.address = address;
  }
  Account类
  @Document
  public class Account {
  @Id
  private ObjectId id;
  private Float total;
  }
  与HibernateRepository类似,通过继承MongoRepository接口,我们可以非常方便地实现对一个对象的增删改查,要使 用Repository的功能,先继承MongoRepository接口,其中T为仓库保存的bean类,TD为该bean的唯一标识的类型,一般为ObjectId。之后在service中注入该接口就可以 使用,无需实现里面的方法,spring会根据定义的规则自动生成。
  例:
  public interface PersonRepository extends
  MongoRepository{
  //这里可以添加额外的查询方法
  }
  但是MongoRepository实现了的只是最基本的增删改查的功能,要想增加额外的查询方法,可以按照以下规则定义接口的方法。自定义查询方 法,格式为“findBy+字段名+方法后缀”,方法传进的参数即字段的值,此外还支持分页查询,通过传进一个Pageable对象,返回Page集合。
  例:
  public interface PersonRepository extends
  MongoRepository{
  //查询大于age的数据
  public Page findByAgeGreaterThan(int age,Pageable page) ;
  }
  下面是支持的查询类型,每三条数据分别对应:(方法后缀,方法例子,mongodb原生查询语句)
  GreaterThan(大于)
  findByAgeGreaterThan(int age)
  {"age" : {"$gt" : age}}
  LessThan(小于)
  findByAgeLessThan(int age)
  {"age" : {"$lt" : age}}
  Between(在...之间)
  findByAgeBetween(int from, int to)
  {"age" : {"$gt" : from, "$lt" : to}}
  IsNotNull, NotNull(是否非空)
  findByFirstnameNotNull()
  {"age" : {"$ne" : null}}
  IsNull, Null(是否为空)
  findByFirstnameNull()
  {"age" : null}
  Like(模糊查询)
  findByFirstnameLike(String name)
  {"age" : age} ( age as regex)
  (No keyword) findByFirstname(String name)
  {"age" : name}
  Not(不包含)
  findByFirstnameNot(String name)
  {"age" : {"$ne" : name}}
  Near(查询地理位置相近的)
  findByLocationNear(Point point)
  {"location" : {"$near" : [x,y]}}
  Within(在地理位置范围内的)
  findByLocationWithin(Circle circle)
  {"location" : {"$within" : {"$center" : [ [x, y], distance]}}}
  Within(在地理位置范围内的)
  findByLocationWithin(Box box)
  {"location" : {"$within" : {"$box" : [ [x1, y1], x2, y2]}}}
  尽管以上查询功能已经很丰富,但如果还不能满足使用情况的话可以用一下方法---基于mongodb原本查询语句的查询方式。
  例:在原接口中加入
  @Query("{ 'name':{'$regex':?2,'$options':'i'}, sales': {'$gte':?1,'$lte':?2}}")
  public Page findByNameAndAgeRange(String name,double ageFrom,double ageTo,Pageable page);
  注释Query里面的就是mongodb原来的查询语法,我们可以定义传进来的查询参数,通过坐标定义方法的参数。
  还可以在后面指定要返回的数据字段,如上面的例子修改如下,则只通过person表里面的name和age字段构建person对象。
  @Query(value="{ 'name':{'$regex':?2,'$options':'i'}, sales':{'$gte':?1,'$lte':?2}}",fields="{ 'name' : 1, 'age' : 1}")
  public Page findByNameAndAgeRange(String name,double ageFrom,double ageTo,Pageable page);


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-626833-1-1.html 上篇帖子: MongoDB 从入门到精通专题教程 下篇帖子: MongoDB环境搭建-Replication搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表