Datastore接口提供一个类型安全的方法来处理java对象在MongoDB中的存储。他提供的主要方法是:get、find、save、delete。
Get方法通过java对象的@Id属性来返回相应的对象。返回结果与带Id条件的find()方法一致。如果未找到,返回null
Datastore ds = ...
Hotel hotel = ds.get(Hotel.class, hotelId);
find方法是Query方法的轻量级包装。方法返回一个Query,支持Iterable 和 QueryResults 接口
Datastore ds = ...
//use in a loop
for(Hotel hotel : ds.find(Hotel.class, "stars >", 3)) {
print(hotel);
}
//get back as a list
List<Hotel> hotels = ds.find(Hotel.class, "stars >", 3).asList();
//sort the results
List<Hotel> hotels = ds.find(Hotel.class, "stars >", 3).sort("-stars").asList();
//get the first matching hotel, by querying with a limit(1)
Hotel gsHotel = ds.find(Hotel.class, "name", "Grand Sierra").get();
//same as
Hotel gsHotel = ds.find(Hotel.class, "name =", "Grand Sierra").get();
还可以使用的符号为[“=“, “==“,“!=“, “<>“, “>“, “<", ">=“, “<=", "in", "nin", "all", "size", "exists"]
如果没有放置任何符号,默认为“=”。“=“和”==“一致,“!=“和”<>“一样
Save方法如下所示:
Datastore ds = ...
Hotel hotel = new Hotel();
ds.save(hotel);
//@Id field is filled in for you (after the save), if you didn't set it.
ObjectId id = hotel.getId();
删除方法能够自动根据query、id或者entity来删除对应的数据
Datastore ds = ...
ds.delete(Hotel.class, "Grand Sierra Resort");
//use a query
ds.delete(ds.createQuery(Hotel.class).filter("pendingDelete", true));
原子方式执行find和delete操作,这个方法将找到第一个符合条件的对象,删除并返回它。
Datastore ds = ...
Hotel grandSierra = ds.findAndDelete(Hotel.class, "Grand Sierra Resort");
与重新保存整个entity相比,update方法允许一些更负责但更有效的更新操作。
比如,你需要更新用户的最后一次登录的操作。每次用户登录后,你只需要更新一个timestamp,但并不需要将整个User加载并重新保存。你可以进行如下的更新操作。
@Entity
class User {
@Id
private ObjectId id;
private long lastLogin;
//... other members
private Query<User> queryToFindMe() {
return datastore.createQuery(User.class).field(Mapper.ID_KEY).equal(id);
}
public void loggedIn() {
long now = System.currentTimeMillis();
UpdateOperations<User> ops = datastore.createUpdateOperations(User.class).set("lastLogin", now);
ds.update(queryToFindMe(), ops);
lastLogin = now;
}
}
这些方法将在使用Morphia注册entities时执行。默认是同步创建index和Capped collections。你可以在程序启动,管理界面或者使用部署脚本来执行。他们能够保证在已有数据的时候在后台创建index。
如果你在程序生命周期里面延迟创建index,你必须确保在存储任何数据之前,创建出capped collections (ensureCaps)。
注:在已有系统上执行这些操作时(这个系统本身存在一些index和capped collections),将不耗费任何时间(同时也不做任何事情)。如果操作的collection不是capped,或者设置不一样,对已有的capped collections不做任务操作,只是在log里面记录一个错误。
Morphia m = ...
Datastore ds = ...
m.map(MyEntity.class);
ds.ensureIndexes(); //creates all defined with @Indexed
ds.ensureCaps(); //creates all collections for @Entity(cap=@CappedAt(...))