`

Mongodb 的ORM框架 Morphia 之 Query接口

阅读更多

Introduction(简介)

                   Query接口是个相当直接的方法。他允许非常确切的过滤方式(基于属性),排序,一个偏移和限制返回结果的数量。

                   query实现也实现了QueryResults接口,此接口允许在查询中访问结果。

 Filter(过滤)

                    一般的.filter(criteria, value)语法被支持。标准语法是属性名和操作("field > ", or "field in")的整合。所有的语法被逻辑"and" 暗暗的联系在一起。               

 

1 Datastore ds = ... 
2 Query q = ds.createQuery(MyEntity. class ).filter( "foo >" , 12 ); 
3 Datastore ds = ... Query q = ds.createQuery(MyEntity. class ).filter( "foo >" , 12 );

             查询foo在12和30之间的实体对象,的方法如下:

1     Datastore ds = ... 
2  
3 Query q = ds.createQuery(MyEntity. class ).filter( "foo >" , 12 ).filter( "foo <" , 30 ); 
4 Datastore ds = ... Query q = ds.createQuery(MyEntity. class ).filter( "foo >" , 12 ).filter( "foo <" , 30 );

Operators(操作符)

                       操作符被用在fileter(...)和MongoDB的查询操作紧密的匹配。                 

operator
mongo op
= $eq
!=, <> $ne
>,<,>=,<= $gt,$lt,$gte,$lte
in $in
nin $nin
elem $elemMatch
exists $exists
all $all
size $size
... ...

            操作符被用在fileter(...)和MongoDB的查询操作紧密的匹配。

 

operator
mongo op
= $eq
!=, <> $ne
>,<,>=,<= $gt,$lt,$gte,$lte
in $in
nin $nin
elem $elemMatch
exists $exists
all $all
size $size
... ...

 Fluent Interface

             沿着.filter(...)方法,这里有个流水型的方法。这些提供一个非常已读的格式。

             fluent 接口以field(name)开始。接着一下任何一个方法都可以添加到这个格式中,

 

  1. 1 Query q = ds.createQuery(MyEntity. class ).field( "foo" ).equal( 1 ); 
    2     
    3 q.field( "bar" ).greaterThan( 12 ); 
    4 q.field( "bar" ).lessThan( 40 );

Methods(方法)

 

method operation comment
exists $exists  
doesNotExist $exists  
greaterThan,greatherThanOrEq,lessThan,lessThanOrEe $gt,$gte,$lt,$lte  
equal,notEqual $eq, $ne  
hasThisOne $eq  
hasAllOf $all  
hasAnyOf $in  
hasNoneOf $nin  
hasThisElement $elemMatch  
sizeEq $size  
       

 Geo-spatial          

                  所有的geo-spatial方法都被分解为"near, 和within"。所有的near查询将会产生结果,按远程和最近的结果。

                  下面的方法接受一个球形的最后参数,表名他们是否应该使用$sphere选项。

 

Method operation comment
near(x, y) $near  
near(x, y, r) $near (w/maxDistance of r)
within(x, y, r) $within + $center  
within(x1, y1, x2, y2) $within + $box  

 

  1. 01 @Entity  
    02 static private class Place { 
    03          @Id protected ObjectId id; 
    04          protected String name = ""
    05          @Indexed (IndexDirection.GEO2D) 
    06          protected double [] loc = null
    07             
    08          public Place(String name, double [] loc) { 
    09                  this .name = name; 
    10                  this .loc = loc; } 
    11     
    12          private Place() {} 
    13
    14     
    15 Place place1 = new Place( "place1" , new double [] { 1 , 1 }); 
    16 ds.save(place1); 
    17     
    18 Place found = ds.find(Place. class ).field( "loc" ).near(, ).get();

Or

              使用流式查询接口时你也可以像一下这样使用"or"查询

 

  1. 1 Query<Person> q = ad.createQuery(Person. class ); 
    2 q.or( 
    3          q.criteria( "firstName" ).equal( "scott" ), 
    4          q.criteria( "lastName" ).equal( "scott"
    5 );

Fields

             属性名也可以像在本地MongoDB查询中那样使用"."标识

  1. 1 Query q = ds.createQuery(Person. class ).field( "addresses.city" ).equal( "San Francisco" ); 
    2 //or with filter, or with this helper method  
    3 Query q = ds.find(Person. class , "addresses.city" , "San Francisco" );

Validation(验证)   

                验证被应用在属性名,和数据类型上。如果在查询中使用的属性名在指定的java类中没有找到将会抛出一个异常。如果一个属性名被“.”标识连接,那么这个表达式的每个

              部分都将会在指定的java对象中进行验证(有一个异常Map来记录那个属性 名被跳过)。

            数据类型问题(比较属性类型和参数类型)作为警告被记录,由于服务器可能会把数据强制转换,或者你发送意思不那么的有意义;服务器使用字节表示一些参数,所以有些类型

          不同的数值也可以匹配(例如数字)。

Disabling validation(是验证无效)

                  通过调用disableValidation()可以使验证变为无效,在开始等于查询或每个查询语句上。

 

1 Datastore ds = ... 
2 Query q = ds.createQuery(MyEntity. class ).disableValidation(); 
3     
4 //or it can be disabled for just one filter  
5     
6 Query q = ds.createQuery(MyEntity. class ).disableValidation().filter( "someOldField" , value).enableValidation().filter( "realField" , otherVal);


Sort(排序)

                你可以通过一个或多个属性名对结果进行升序或降序排序

1 Datastore ds = ... 
2 Query q = ds.createQuery(MyEntity. class ).filter( "foo >" , 12 ).order( "dateAdded" ); 
3 ... // desc order  
4 Query q = ds.createQuery(MyEntity. class ).filter( "foo >" , 12 ).order( "-dateAdded" ); 
5 ... // asc dateAdded, desc foo  
6 Query q = ds.createQuery(MyEntity. class ).filter( "foo >" , 12 ).order( "dateAdded, -foo" );

Offset(skip)

              你可以通过在查询是指定一个偏移值是服务器跳过一些记录元素。这将比使用几个属性的范围进行查询要低效的多。如下所示:

 

1 Datastore ds = ... 
2 Query q = ds.createQuery(MyEntity. class ).filter( "foo >" , 12 ).offset( 1000 );

 

Ignoring Fields(忽略属性)

                 MongoDB也支持只返回一些属性。这在应用中显得有点奇怪,但是这个在修剪掉一部分嵌套时是非常有用的方法。这将会导致局部实体对象,应该不慎重使用,如果可以的话。

01 Datastore ds = ... 
02 MyEntity e = ds.createQuery(MyEntity. class ).retrievedFields( true , "foo" ).get(); 
03     
04 val = e.getFoo(); // only field returned  
05     
06 ... 
07     
08 MyEntity e = ds.createQuery(MyEntity. class ).retrievedFields( false , "foo" ).get(); 
09     
10 val = e.getFoo(); // only field not returned 
11 Datastore ds = ... MyEntity e = ds.createQuery(MyEntity. class ).retrievedFields( true , "foo" ).get(); val = e.getFoo(); // only field returned ... MyEntity e = ds.createQuery(MyEntity.class).retrievedFields(false, "foo").get(); val = e.getFoo(); // only field not returned
Returning Data      (返回值)

 

                 仅仅访问QueryResults的一个方法就可以返回你的数据。没有一个方法会影响Query。他们将会单独的离开Query,因此你可以继续通过调用相应的方法来获取你想要的数据。

 

method does
get() 返回第一个Entity,--使用limit(1)
asList() 以一个集合的方式返回所有的结果项,  如果一个大的数据结果将会付出代价
fetch() 明确的返回一个Iterable实例
asKeyList() 以List的方式返回所有数据项的Key<T>  ---仅仅在服务器中得到ID属性
fetchEmptyEntities() 仅仅想fetch()方法,但是使用id属性填充

 

  • 01 Datastore ds = ... 
    02 Query q = ds.createQuery(MyEntity. class ).filter( "foo >" , 12 ); 
    03     
    04 //single entity  
    05 MyEntity e = q.get(); 
    06     
    07 e = q.sort( "foo" ).get(); 
    08    
    09 //for  
    10 for (MyEntity e : q) 
    11    print(e); 
    12     
    13 //list  
    14 List<MyEntity> entities = q.asList()
  • 分享到:
    评论

    相关推荐

      MongoDb ORM 框架(构建类似 sql 的体验,体验风格与 wood 类似)

      例如,`mongox-main`可能是一个MongoDB ORM框架的核心库或者项目主文件,包含了框架的主要功能和接口。开发者可以通过导入和初始化这个库,然后利用其提供的API进行数据库操作。例如,创建一个新的模型、执行查询、...

      使用Morphia框架操作mongodb

      在Java开发中,Morphia是一个优秀的对象数据映射(ODM)框架,它简化了与MongoDB之间的交互,使得开发者可以像操作传统关系型数据库那样操作文档数据库。本文将深入探讨如何使用Morphia框架来操作MongoDB。 首先,...

      Mongo的ORM框架的学习Morphia

      在本文中,我们将探讨MongoDB的ORM框架Morphia,并结合Spring Data MongoDB的使用来创建一个集成应用。ORM(对象关系映射)框架是将数据库操作转化为对象模型的方法,简化了开发过程,使得开发者可以专注于业务逻辑...

      基于Java的ORM框架Mongodb-ORM.zip

      mongodb-orm简介Mongodb ORM是基于java的ORM框架,简化了SDK的使用,使代码变得更清晰、简单。 与Ibatis类似,将查询、执行语句封装在xml中,与代码隔离。简称MQL。 项目中使用加入mongodb orm的支持包1. 添加jar...

      Morphia一个nosql的ORM框架

      在传统的SQL世界里,ORM框架如Hibernate简化了与数据库的交互,而在NoSQL领域,Morphia扮演着相同的角色,使得开发者能够以面向对象的方式操作MongoDB数据,而无需直接编写低级的MongoDB查询语言。 **1. MongoDB和...

      java mongodb orm 实现-基于mongodb-driver开发的ORM.pdf

      MongoDB的ORM(Object-Relational Mapping)框架使得Java开发者能够更方便地将数据模型与数据库交互,而无需关注底层的MongoDB API细节。在本文中,我们将讨论如何基于`mongodb-driver`开发一个简单的ORM实现,以...

      基于mongodb官方Java驱动的orm框架,允许子类嵌套.zip

      这个压缩包“基于mongodb官方Java驱动的orm框架,允许子类嵌套.zip”显然是一个ORM(对象关系映射)框架,旨在简化Java应用与MongoDB之间的数据操作,特别是支持子类的嵌套结构。 ORM框架允许开发者用面向对象的...

      mongodb+springmvc+morphia

      后续提交放在https://github.com/zdsiyan/watermelon 上, 用eclipse导入该工程需安装m2eclipse,jetty等查件. 另外.settings下的org.eclipse.wst.common.component文件如下: ...&lt;/project-modules&gt;

      使用 Morphia 和 MongoDB 实现域模型持久性(ZZ)

      Morphia 是一个 Java 框架,它为 MongoDB 提供了对象数据映射(Object Data Mapping,简称 ODM)功能,使得开发者可以更方便地在 Java 对象与 MongoDB 文档之间进行转换。本篇文章将详细介绍如何使用 Morphia 和 ...

      Spring整合其他ORM框架

      在企业级应用开发中,数据持久化是必不可少的一部分,ORM(Object-Relational Mapping)框架则解决了对象与关系数据库之间的映射问题,使得开发更加便捷。Spring 提供了对多种 ORM 框架的集成支持,如 Hibernate、...

      SpringMVC+Shiro+MongoDB基础框架

      Spring Data MongoDB提供了Repository接口,通过该接口可以方便地执行增删改查等操作,无需编写大量的DAO层代码。 **整合流程** 1. **配置环境**:首先,需要在项目中引入SpringMVC、Shiro和MongoDB的相关依赖,...

      mongodb-orm-master_MongoDB_

      标题"mongodb-orm-master"可能是指一个MongoDB的ORM框架或库,用于简化和优化对MongoDB数据库的访问。这个项目可能是为了提供一个高效、易用的接口,使得开发者在使用MongoDB时可以更加专注于业务逻辑,而不是数据库...

      mysql和node.js整合学习,其中有 squence 和 node.js的orm框架,两个 orm框架的学习.zip

      尽管未明确指出,但Node.js社区中有许多其他流行的ORM选项,如TypeORM(适用于TypeScript),Mongoose(针对MongoDB),或者Objection.js等。每个框架都有其独特的特性和优势,比如Mongoose提供了强大的Schema和...

      spring-mongodb-morphia:springdata-mongo morphia mongodb 学习

      在IT行业中,Spring框架是Java开发者的首选工具之一,它为构建企业级应用程序提供了全面的解决方案。MongoDB则是一款流行的NoSQL数据库系统,适合处理大量非结构化数据。Morphia是Google开发的一个用于Java的MongoDB...

      Morphia 操作 MongoDB.pdf

      Morphia 是一个 Java ORM(对象关系映射)库,用于简化 MongoDB 的数据操作,将数据模型与数据库文档之间的转换自动化。在本文中,我们将深入探讨如何使用 Morphia 进行 MongoDB 的操作。 首先,为了在 Java 项目中...

      铱:针对Node.js的高性能MongoDB ORM

      Iridium尝试采用一种难以置信的轻量级实现,而不是采用Mongoose和其朋友之类的ODM经常喜欢的“重新实现一切”方法,而是要求您学习全新的API并将您锁定为特定的编码样式,当您想做任何更复杂的事情时,它会变得很...

      mongodb的实现类及实现接口

      这个接口可能包含了连接MongoDB数据库、执行查询、插入数据、更新数据以及删除数据等方法。 例如,接口可能包含以下方法: ```java public interface IMongoJDBCUtilCJB { void connect(String connectionString, ...

      Morphia 操作 MongoDB.docx

      Morphia是针对MongoDB的一个Java持久层框架,它提供了简单易用的API,使得开发者能够方便地在Java应用程序中操作MongoDB数据库。 【Morphia的安装与配置】 要在Java项目中使用Morphia,首先需要下载MongoDB的Java...

      基于MyBatisPlus模式的MongoDB操作框架设计源码

      该项目是基于MyBatisPlus模式的MongoDB操作框架设计源码,总计315个文件,其中包括299个Java源文件、5个XML配置文件、2个Git忽略文件、2个Markdown文档、2个PNG图片文件、1个LICENSE文件以及多个配置文件(包括...

    Global site tag (gtag.js) - Google Analytics