(转)Mongodb 的ORM框架 Morphia 之 Query接口



  • Introduction
  • Filter
    • Operators
  • Fluent Interface
    • Methods
      • Geo-spatial
      • Or
  • Fields
  • Validation
    • Disabling Validation
  • Sort
  • Offset (skip)
  • Ignoring Fields
  • Returning Data

          Introduction(简介)

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

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

            Filter(过滤)

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

[java]  view plain copy
  1. Datastore ds = ...  
  2. Query q = ds.createQuery(MyEntity.class).filter("foo >"12);  
                     查询foo在12和30之间的实体对象,的方法如下:

   

[java]  view plain copy
  1. Datastore ds = ...  
  2. 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
......

            Fluent Interface

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

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

                  

[java]  view plain copy
  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(方法)

              

methodoperationcomment
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选项。

                  

Methodoperationcomment
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 

  

[java]  view plain copy
  1. @Entity  
  2. static private class Place {  
  3.         @Id protected ObjectId id;  
  4.         protected String name = "";  
  5.         @Indexed(IndexDirection.GEO2D)  
  6.         protected double[] loc = null;  
  7.           
  8.         public Place(String name, double[] loc) {  
  9.                 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(00).get();  
          Or

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

             

[java]  view plain copy
  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查询中那样使用"."标识

               

[java]  view plain copy
  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()可以使验证变为无效,在开始等于查询或每个查询语句上。

                  

[java]  view plain copy
  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(排序)

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

                  

[java]  view plain copy
  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)

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

              

[java]  view plain copy
  1. Datastore ds = ...  
  2. Query q = ds.createQuery(MyEntity.class).filter("foo >"12).offset(1000);  
       Ignoring Fields(忽略属性)

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

                

[java]  view plain copy
  1. Datastore ds = ...  
  2. MyEntity e = ds.createQuery(MyEntity.class).retrievedFields(true"foo").get();  
  3.   
  4. val = e.getFoo(); // only field returned  
  5.   
  6. ...  
  7.   
  8. MyEntity e = ds.createQuery(MyEntity.class).retrievedFields(false"foo").get();  
  9.   
  10. val = e.getFoo(); // only field not returned  
      Returning Data      (返回值)


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

                    

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

     

[java]  view plain copy
  1. Datastore ds = ...  
  2. Query q = ds.createQuery(MyEntity.class).filter("foo >"12);  
  3.   
  4. //single entity  
  5. MyEntity e = q.get();  
  6.   
  7. e = q.sort("foo").get();  
  8.   
  9. //for  
  10. for (MyEntity e : q)  
  11.   print(e);  
  12.   
  13. //list  
  14. List<MyEntity> entities = q.asList();  
    英语水平有限,请大侠斧正
  • Introduction
  • Filter
    • Operators
  • Fluent Interface
    • Methods
      • Geo-spatial
      • Or
  • Fields
  • Validation
    • Disabling Validation
  • Sort
  • Offset (skip)
  • Ignoring Fields
  • Returning Data

          Introduction(简介)

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

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

            Filter(过滤)

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

[java]  view plain copy
  1. Datastore ds = ...  
  2. Query q = ds.createQuery(MyEntity.class).filter("foo >"12);  
                     查询foo在12和30之间的实体对象,的方法如下:

   

[java]  view plain copy
  1. Datastore ds = ...  
  2. 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
......

            Fluent Interface

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

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

                  

[java]  view plain copy
  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(方法)

              

methodoperationcomment
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选项。

                  

Methodoperationcomment
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 

  

[java]  view plain copy
  1. @Entity  
  2. static private class Place {  
  3.         @Id protected ObjectId id;  
  4.         protected String name = "";  
  5.         @Indexed(IndexDirection.GEO2D)  
  6.         protected double[] loc = null;  
  7.           
  8.         public Place(String name, double[] loc) {  
  9.                 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(00).get();  
          Or

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

             

[java]  view plain copy
  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查询中那样使用"."标识

               

[java]  view plain copy
  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()可以使验证变为无效,在开始等于查询或每个查询语句上。

                  

[java]  view plain copy
  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(排序)

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

                  

[java]  view plain copy
  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)

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

              

[java]  view plain copy
  1. Datastore ds = ...  
  2. Query q = ds.createQuery(MyEntity.class).filter("foo >"12).offset(1000);  
       Ignoring Fields(忽略属性)

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

                

[java]  view plain copy
  1. Datastore ds = ...  
  2. MyEntity e = ds.createQuery(MyEntity.class).retrievedFields(true"foo").get();  
  3.   
  4. val = e.getFoo(); // only field returned  
  5.   
  6. ...  
  7.   
  8. MyEntity e = ds.createQuery(MyEntity.class).retrievedFields(false"foo").get();  
  9.   
  10. val = e.getFoo(); // only field not returned  
      Returning Data      (返回值)


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

                    

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

     

[java]  view plain copy
  1. Datastore ds = ...  
  2. Query q = ds.createQuery(MyEntity.class).filter("foo >"12);  
  3.   
  4. //single entity  
  5. MyEntity e = q.get();  
  6.   
  7. e = q.sort("foo").get();  
  8.   
  9. //for  
  10. for (MyEntity e : q)  
  11.   print(e);  
  12.   
  13. //list  
  14. List<MyEntity> entities = q.asList();  
    英语水平有限,请大侠斧正
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值