一、mongoDB
mongoDB是目前最接近关系型数据库的一种Key-value 数据库。它支持基本的增删改查,也支持索引;但不支持事务和join操作。
mongodb和传统的关系型数据的差别,体现在设计阶段,就是设计思路的转变。使用mongodb需要更多的关注实际的业务,要考虑如何组织数据能让业务使用的更方便合理;而关系型数据库由于已经有了很多比较明确的设计方式,使用起来有据可循。
mongodb中的一些概念和传统关系型数据库的比较
mongodb rmdb
database database
collection table
document record
index index
mongodb服务器使用C语言开发的,提供了多种常用语言的编程接口,这里以Java做示例。
二、mongdoDB的更新操作
mongdb在传统的更新操作之外,还支持原子操作和就地更新(in-place update)。
java的update接口在类DBCollection中实现:
public abstract void update( DBObject q , DBObject o , boolean upsert , boolean multi ) throws MongoException ;
上述方法签名,包含了一个upsert的概念,upsert可以理解为,更新一个document,如果该document不存在,那么就插入一个新的。
q 用来找出要更新的旧对象
o 要做的更新操作
upsert 是否使用upsert的方式
multi 当q找到多个对象时,multi=true则全都更新,=false(缺省的)则只更新第一个
三、morphia及其对mongdoDB更新操作的支持
morphia是一个针对于mongodb的轻量级的ORM(Morphia is a lightweight type-safe library for mapping your Java objects to/from MongoDB)。目前其官网(http://code.google.com/p/morphia/)上发布的是0.94的SNAPSHOT版。
前面所述mongodb的更新方式,morphia给予了支持,具体见下面代码段:
private <T> UpdateResults<T> update(Query<T> query, DBObject u, boolean createIfMissing, boolean multi) { DBCollection dbColl = getCollection(((QueryImpl<T>) query).getEntityType()); DBObject q = ((QueryImpl<T>) query).getQueryObject(); if (q == null) q = new BasicDBObject(); dbColl.update(q, u, createIfMissing, multi); DBObject dbObj = dbColl.getDB().getLastError(); return new UpdateResults<T>(dbObj); }
上述代码在DatastoreImpl中,DatastoreImpl实现了Datastore接口,这个接口是morphia的核心接口,对外提供数据库的各种操作。