- 浏览: 294966 次
- 性别:
- 来自: 西安
-
文章分类
最新评论
-
Mo-康少:
感谢
eclipse安装freemarker插件 -
cmy0:
非常受用,感謝
eclipse安装freemarker插件 -
liuyuanhui0301:
RTMP 简介 -
xa_zbl:
最后没有采用这种方法,发现原因出在jquery1.7和vali ...
jQuery的validate 在ie9和火狐下能用 在ie8下无效解决方法。 -
woshixushigang:
你好,我也遇到jquery vaidate 再ie下失效问题, ...
jQuery的validate 在ie9和火狐下能用 在ie8下无效解决方法。
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
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选项。
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 |
-
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
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
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
仅仅访问QueryResults的一个方法就可以返回你的数据。没有一个方法会影响Query。他们将会单独的离开Query,因此你可以继续通过调用相应的方法来获取你想要的数据。
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()
发表评论
-
net.sf.ezmorph.bean.MorphDynaBean cannotbe cast to xxx
2016-09-30 10:36 1067net.sf.ezmorph.bean.MorphDynaBe ... -
内连接 外连接 交叉连接 笛卡尔积
2016-07-25 11:45 705首先划分一下,连接分为三种:内连接、外连接、交叉连接 ... -
MySQL数据类型DECIMAL
2016-02-23 10:28 851DECIMAL 类型不同于FLOAT ... -
ibatis 批量删除数据
2013-08-29 17:38 2805<delete id="deleteMem ... -
使用 apache common dbcp +common pool+mysql连接无效的问题
2012-11-28 11:51 1017Throwable occurred: org.sprin ... -
100多个数据据表字段说明(二)
2011-11-03 16:52 1911messageid 信息ID userid 用 ... -
100多个数据据表字段说明
2011-11-03 15:57 3253第一个表_admin (管理 ... -
浅谈char,Varchar,NVarchar的区别
2010-04-14 17:45 1315这3种字符串数据类型是 ... -
[转贴]hsql数据库入门
2010-03-18 15:07 1266前言:该文章只是简单 ... -
关于数据库获取数据出现java.sql.SQLException: Underlying input stream returned zero bytes
2009-10-28 14:40 1349出现如题的异常: 原因是text类型字段在作怪.因为数据表中 ... -
Mysql5.0中文乱码问题解决方案
2009-04-15 23:17 2003需注意以下三点: 1、创建数据库的时候:CREATE DAT ... -
如何把SQLSERVER里表里的数据导出成为insertinto脚本
2008-12-01 03:15 1599新建如下的存储过程:(执行该存储过程会生成一条查询语句,执行查 ... -
Oracle中的大字段 Blob/Clob
2008-05-28 12:29 5177数据库中提供了两种字段类型 Blob 和 Clob 用于存 ... -
连接池的应用
2008-05-22 01:04 1196连接池:初始化(建立)一些连接,常驻内存,用的时候向连接池要, ...
相关推荐
在传统的SQL世界里,ORM框架如Hibernate简化了与数据库的交互,而在NoSQL领域,Morphia扮演着相同的角色,使得开发者能够以面向对象的方式操作MongoDB数据,而无需直接编写低级的MongoDB查询语言。 **1. MongoDB和...
Morphia 是一个针对 MongoDB 的 Java ORM(对象关系映射)框架,它允许开发者使用 Java 对象直接操作 MongoDB 数据库,简化了数据库操作。以下是对 Morphia 操作 MongoDB 的详细介绍: 1. **安装与配置** - **...
在IT行业中,Spring框架是Java开发者的首选工具之一,它为构建企业级应用程序提供了全面的解决方案。MongoDB则是一款流行的NoSQL数据库系统,适合处理大量非结构化数据。Morphia是Google开发的一个用于Java的MongoDB...
Morphia 是一个 Java ORM(对象关系映射)库,用于简化 MongoDB 的数据操作,将数据模型与数据库文档之间的转换自动化。在本文中,我们将深入探讨如何使用 Morphia 进行 MongoDB 的操作。 首先,为了在 Java 项目中...
在Java开发中,为了方便地操作MongoDB,通常会使用ORM(Object-Relational Mapping)框架,Morphia就是其中的一个。Morphia是Google开发的一个Java库,它提供了将Java对象映射到MongoDB文档的简单方式,类似于JPA对于...