褰撲粖NoSQL棰嗗煙涓湁寰堝鏈夊姏鐨勭珵浜夎呴氳繃澶氱鏂瑰紡鏉ュ鐞嗘搗閲忔暟鎹棶棰樸傚叾涓噸瑕佺殑瑙e喅鏂規涔嬩竴灝辨槸MongoDB銆侻ongoDB鏄潰鍚戞枃妗g殑寮辯粨鏋勫寲瀛樺偍鏂規錛屼嬌鐢↗SON鏍煎紡鏉ュ睍鐜般佹煡璇㈠拰淇敼鏁版嵁銆?/span>
MongoDB鏂囨。鐩稿綋瀹屽錛屾墿灞曡妯′笌瀹夎涓鏍風畝鍗曘傚畠鎻愪緵鍐椾綑銆佸垏鐗囥佺儲寮曚互鍙妋ap/reduce絳夋蹇墊敮鎸併侻ongoDB鐨勫紑婧愮ぞ鍖洪潪甯稿ぇ涓旈潪甯告椿璺冦侻ongoDB鍦ㄥ緢澶氬ぇ鍨嬩駭鍝佷腑琚疄闄呰繍鐢紝濡傦細Disney, Craigslist, Foursquare, Github 鍜孲ourceForge銆侻ongoDB鏄竴涓紑婧愰」鐩紝鐢?/span>10gen.com寤虹珛騫剁淮鎶わ紝璇ュ叕鍙哥敱DoubleClick鐨勫墠浠繪墽琛屼漢鍛樺垱绔嬨傚悓鏃訛紝10gen涔熸彁渚涗簡鏋佸ソ鐨勫晢涓氭敮鎸佷笌鍙備笌寤鴻銆?/span>
MongoDB浣滀負涓涓彲鐢∟oSQL鏂規鍏鋒湁寰堝浼樺娍銆傛垜鍒氬紑濮嬫帴瑙oSQL鏁版嵁搴撲簡瑙d簡涓緋誨垪鍩轟簬Java鐨勬柟妗堬紝騫朵笖鑺變簡澶ч噺鐨勬椂闂存潵寮勬噦浠涔堟槸鍒楀鏃忥紝Hadoop涓嶩Base鐨勫叧緋伙紝ZooKeeper鍒板簳鏄粈涔堛傚綋鎴戠粓浜庡叏閮ㄦ竻妤氫箣鍚庯紝鍙戠幇Cassandra涓嶩Base紜疄鏄浜嶯oSQL棰嗗煙闈炲父鍙潬銆佸彲淇¤禆鐨勮В鍐蟲柟妗堛備絾涓庡叾浠栫殑瑙e喅鏂規鐩告瘮錛孧ongoDB璁╂垜鍦ㄨ兘澶熷紑濮嬪啓浠g爜涔嬪墠錛屼笉鐢ㄧ悊瑙i偅涔堝鐨勬蹇點?/span>
涓庡叾浠栬蔣浠剁浉浼鹼紝MongoDB涔熷瓨鍦ㄧ己闄楓傜粡榪囦竴孌墊椂闂翠嬌鐢∕ongoDB錛屾垜鍒椾婦緇忓巻榪囧茍闇瑕佹敞鎰忕殑涓浜涗簨鎯咃紝鎴戞垚涓?#8220;Gotchas”錛?/span>
MongoDB鍩烘湰鏄嬌鐢↗avaScript瀹㈡埛绔懡浠よ紼嬪簭鏉ヨ繘琛屽鏉備換鍔$鐞嗙殑錛屽鏁版嵁鏁村悎鍜岀畝鍗曚俊鎭鐞嗭紝緙栫▼閮芥槸瀹屽叏浣跨敤JavaScript璇█鏉ョ殑銆傛湰鏂囦腑錛屾垜浠細灞曠ず鍛戒護琛岀殑浣跨敤紺轟緥銆傜幇鍦ㄦ湁澶ч噺鐨凪ongoDB瀹㈡埛绔駭鍝佹彁渚涳紝騫朵笖鐢盡ongoDB紺懼尯鏉ユ敮鎸侀┍鍔ㄣ傞氬父姣忕緙栫▼璇█閮芥湁椹卞姩錛屽茍涓旀墍鏈夋祦琛岀殑璇█閮芥湁鍖呮嫭錛屼竴浜涗笉閭d箞嫻佽鐨勪篃鍖呭惈鍦ㄥ唴銆傝繖綃囨枃绔犲睍紺轟簡浣跨敤MongoDB鐨凧ava椹卞姩錛屽茍浣跨敤涓涓狾RM搴擄紙MJORM錛変笌涔嬭繘琛屾瘮杈冦?/span>
鍦ㄨВ鍐崇殑浼楀鏈夋剰鎬濈殑闂涓紝鏈榪?span>NoSQL鏁版嵁瀛樺偍鍦ㄥ紑鍙戣呬腑涓昏鐨勯棶棰樿秼鍔垮氨鏄璞″叧緋繪槧灝勩傚璞″叧緋繪槧灝勫氨鏄皢浼犵粺涓繚瀛樺湪鍏崇郴鍨嬫暟鎹簱涓殑鎸佷箙鍖栨暟鎹槧灝勪負鍦ㄥ簲鐢ㄧ▼搴忎腑浣跨敤鐨勫璞°傝繖浣垮緱緙栫▼璇█浣跨敤璧鋒潵鏇村姞嫻佺晠鍜岃嚜鐒躲?/span>
MongoDB闈㈠悜鏂囨。鐨勬灦鏋勪嬌寰楀畠闈炲父閫傚悎瀵硅薄鍏崇郴鏄犲皠錛屽洜涓烘枃妗f湰韜氨鏄互瀵硅薄褰㈠紡瀛樺偍鐨勩傚彲鎯滄病鏈夊お澶氱殑MongoDB鐨凧ava瀵硅薄鍏崇郴鏄犲皠搴擄紝浣嗘槸榪樻槸鏈変竴浜涳紝濡?/span>morphia-(A type-safe Java library for MongoDB)錛?span> spring-data(SpringData欏圭洰鐨凪ongoDB瀹炵幇)
榪欎簺ORM搴撳ぇ閲忎嬌鐢ㄤ簡娉ㄨВ錛屽洜涓轟竴浜涘師鍥犲鎴戜笉閫傚悎錛屽叾涓渶閲嶈鐨勫氨鏄繖浜涜娉ㄨВ鐨勫璞″湪澶氫釜欏圭洰涓殑鍏煎鎬ч棶棰樸傝繖璁╂垜寮濮嬩簡mongo-Java-orm 鎴栬?"MJORM" (鍙戦煶 me-yorm)欏圭洰錛屼竴涓狹ongoDB鐨凧ava瀵硅薄鍏崇郴鏄犲皠欏圭洰銆侻JORM鏄湪MIT璁稿彲涔嬩笅錛屽茍涓斿湪鍙戝竷鍦ㄤ簡google code project銆傞」鐩噰鐢?span>maven鏋勫緩錛屽茍涓攎aven鏋勪歡浠撳簱鎵樼浜巊oogle code鐗堟湰鎺у埗鏈嶅姟鍣ㄣ侻JORM鐨勬渶鏂板彲鐢ㄥ彂甯冪増鏈負0.15錛屽凡緇忕敱涓浜涢」鐩嬌鐢ㄤ笌鐢熶駭鐜涓?/span>
Maven鐨勪嬌鐢ㄨ呴鍏堝簲褰撳湪pom.xml涓姞鍏JORM鐨刴aven浠撳簱錛屼嬌寰桵JORM鏋勪歡鍙敤銆?/span>
<repository>
<id>mjorm-webdav-maven-repo</id>
<name>mjorm maven repository</name>
<url>http://mongo-Java-orm.googlecode.com/svn/maven/repo/</url>
<layout>default</layout>
</repository>
鐒跺悗鍔犲叆渚濊禆:
<dependency>
<groupId>com.googlecode</groupId>
<artifactId>mongo-Java-orm</artifactId>
<version>0.15</version>
</dependency>
榪欐牱灝卞彲浠ュ湪搴旂敤涓紩鍏?span>MJORM浠g爜銆傚亣濡傛病鏈変嬌鐢╩aven錛屽垯浣犻渶瑕佹墜鍔ㄤ笅杞組JORM鐨刾om.xml涓垪涓劇殑鎵鏈変緷璧栥?/span>
渚濊禆宸茬粡瀵煎叆錛屽彲浠ュ紑濮嬬紪鐮佷簡銆傛垜浠粠POJO寮濮?
class Author {
private String firstName;
private String lastName;
// ... setters and getters ...
}
class Book {
private String id;
private String isbn;
private String title;
private String description;
private Author author;
// ... setters and getters ...
}
鎴戜滑鍦ㄨ繖涓璞℃ā鍨嬩腑鐨勬弿榪版槸錛屼綔鑰呮湁ID銆佸鍜屽悕錛屼功鏈塈D銆両SNB銆佹爣棰樸佹弿榪板拰浣滆呫?/span>
浣犲彲鑳芥敞鎰忓埌涔︾殑id灞炴ф槸涓涓瓧絎︿覆錛岃繖鏄負浜嗛傚簲MongoDB鐨勫璞D綾誨瀷銆侻ongoDB鐨処D鏄竴涓?2瀛楄妭鐨勪簩榪涘埗鍊兼樉紺轟負涓涓崄鍏繘鍒剁殑瀛楃涓層侻ongoDB瑕佹眰闆嗗悎涓殑姣忎釜鏂囨。閮藉繀欏繪湁涓涓敮涓id錛屼絾涓嶈姹備竴瀹氳鏄疧bjectId銆傜洰鍓峂JORM鍙敮鎸丱bjectId錛屽茍涓旀樉紺轟負瀛楃涓層?/span>
浣犱篃鍙兘娉ㄦ剰鍒頒簡Author娌℃湁id瀛楁銆傝繖鏄洜涓築ook鏄畠鐨勭埗鏂囨。錛屽洜姝や笉闇瑕佹湁id銆傝浣忥紝MongoDB鍙姹傞泦鍚堜腑鐨勬枃妗e湪鏍圭駭鍒殑id銆?/span>
涓嬩竴涓楠ゅ氨鏄緩绔?span>XML鏄犲皠鏂囦歡錛孧JORM鑳藉灝哅ongoDB鏂囨。杞崲涓哄璞°傛垜浠負姣忎釜鏂囨。鍒涘緩涓涓璞′綔涓虹ず鑼冿紝鏃犺灝嗘墍鏈夌殑鏄犲皠鏀懼湪涓涓猉ML鏂囦歡涓繕鏄垎寮閮芥槸鍙互鐨勩?/span>
Author.mjorm.xml
:
<?xml version="1.0"?>
<descriptors>
<object class="Author">
<property name="firstName" />
<property name="lastName" />
</object>
</descriptors>
Book.mjorm.xml
:
<?xml version="1.0"?>
<descriptors>
<object class="Book">
<property name="id" id="true" auto="true" />
<property name="isbn" />
<property name="title" />
<property name="description" />
<property name="author" />
</object>
</descriptors>
榪欎簺鏄犲皠鏂囦歡鑳藉寰堝ソ鐨勮嚜瑙i噴銆?/span>descriptors
鍏冪礌鏄牴鍏冪礌錛屽繀欏誨寘鍚湪姣忎釜鏄犲皠鏂囦歡涓傚湪瀹冧笅闈㈡槸object
鍏冪礌瀹氫箟浜嗘枃妗d笌涔嬪搴旂殑綾匯?/span>Object
鍖呭惈鐨?/span>
property
鍏冪礌涓昏鐢ㄤ簬鎻忚堪POJO涓殑灞炴т互鍙婅繖浜涘睘鎬у浣曚笌MongoDB涓殑鏂囨。鎯沖搴斻?/span>property
鍏冪礌鑷沖皯蹇呴』鍖呭惈涓涓?/span>name
灞炴э紝榪欎釜鍏冪礌灝辨槸POJO鍜孧ongoDB鐨勬枃妗d腑鐨勫睘鎬у悕縐般?/span>column
灞炴у垯鏄彲閫夌殑錛岀敤浜庣壒瀹氫竴涓湪MongoDB鏂囨。涓殑鍙夊睘鎬у悕縐般?/span>
property
鍏冪礌褰撲腑鐨?span>id灞炴у簲璇ユ槸瀵硅薄鐨勫敮涓璇嗗埆銆備竴涓璞″彧鑳芥湁涓涓?/span>property
鍏冪礌鍖呭惈id灞炴с?/span>auto
鐨勮緗細浣垮緱MJORM鍦ㄦ寔涔呭寲鏃朵負璇ュ睘鎬ц嚜鍔ㄧ敓鎴愪竴涓箋?/span>
鍙互鍦?span>google code鐨凪JORM欏圭洰涓婚〉涓煡鐪媂ML鏄犲皠鏂囦歡鐨勬洿澶氱粏鑺傛弿榪般?/span>
鎴戜滑鍒涘緩浜嗘暟鎹ā鍨嬩互鍙婃槧灝勬枃浠訛紝浣垮緱MJORM鍙互浠嶮ongoDB搴忓垪鍙蜂互鍙婂弽搴忓垪鍙稰OJO銆傛垜浠彲浠ヨ繘琛屼竴浜涙湁鎰忔濈殑浜嬫儏浜嗭紝棣栧厛鎵撳紑MongoDB鐨勯摼鎺ワ細
Mongo mongo = new Mongo(
new MongoURI("mongodb://localhost/mjormIsFun")); // 10gen driver
Mongo
瀵硅薄鏄敱10gen緙栧啓鐨凧ava椹卞姩鎻愪緵鐨勩傜ず渚嬩腑榪炴帴浜嗕竴涓湰鍦扮殑MongoDB瀹炰緥涓殑mjormIsFun鏁版嵁搴撱傛帴涓嬫潵鎴戜滑鍒涘緩MJORM ObjectMapper
銆傜洰鍓?/span>ObjectMapper
鍦∕JORM涓殑鍞竴瀹炵幇灝辨槸XmlDescriptorObjectMapper
錛屼嬌鐢╔ML緇撴瀯鎻忚堪淇℃伅銆傚彲鑳戒箣鍚庝細澧炲姞瀵規敞瑙f垨鍏朵粬緇撴瀯瀹氫箟鐨勬敮鎸併?/span>
XmlDescriptorObjectMapper objectMapper = new XmlDescriptorObjectMapper();
mapper.addXmlObjectDescriptor(new File("Book.mjorm.xml"));
mapper.addXmlObjectDescriptor(new File("Author.mjorm.xml"));
寤虹珛濂戒簡XmlDescriptorObjectMapper
騫朵笖鍔犲叆浜嗘槧灝勬枃浠躲傛帴涓嬫潵寤虹珛鐢盡JORM鎻愪緵鐨?/span>MongoDao
瀵硅薄鐨勫疄渚嬨?/span>
DB db = mongo.getDB("mjormIsFun"); // 10gen driver
MongoDao dao = new MongoDaoImpl(db, objectMapper);
棣栧厛鎴戜滑瑕佽幏寰?span>10gen椹卞姩鎻愪緵鐨凞B瀵硅薄瀹炰緥銆傜劧鍚庝嬌鐢―B鍜?/span>ObjectMapper
寤虹珛MongoDao
銆傛垜浠噯澶囧紑濮嬫寔涔呭寲鏁版嵁錛屽緩绔嬩竴涓?/span>Book
鐒跺悗淇濆瓨鍒癕ongoDB涓?/span>
Book book = new Book();
book.setIsbn("1594743061");
book.setTitle("MongoDB is fun");
book.setDescription("...");
book = dao.createObject("books", book);
System.out.println(book.getId()); // 4f96309f762dd76ece5a9595
棣栧厛寤虹珛Book
瀵硅薄騫朵笖濉鹼紝鐒跺悗璋冪敤MongoDao
鐨?/span> createObject
鏂規硶錛屽皢Book
瀵硅薄浼犲叆"books
" 鐨勯泦鍚堜腑銆侻JORM浼氭寜鐓т箣鍓嶇殑xml鏄犲皠鏂囦歡灝?/span>Book
杞崲涓?/span>DBObject
(榪欐槸10gen鐨凧ava椹卞姩浣跨敤鐨勫熀鏈被鍨?錛屽茍淇濆瓨涓涓柊鐨勬枃妗h繘"books
" 闆嗗悎銆侻JORM榪斿洖Book瀵硅薄鏃訛紝id灞炴т細琚~鍏呫傝娉ㄦ剰錛孧ongoDB榛樿鏄笉闇瑕佸湪浣跨敤鍓嶅緩绔嬫暟鎹簱鎴栭泦鍚堢殑錛岀郴緇熶細鍦ㄩ渶瑕佹椂鑷姩鍒涘緩錛岃繖鍙兘浼氶犳垚鏌愪簺鍥版壈銆傚湪MongoDB鐨勫懡浠よ涓煡鐪婤ook瀵硅薄澶ф濡備笅錛?/span>
> db.books.find({_id:ObjectId("4f96309f762dd76ece5a9595")}).pretty()
{
"_id": ObjectId("4f96309f762dd76ece5a9595"),
"isbn": "1594743061",
"title": "MongoDB is fun",
"description": "..."
}
鎴戜滑鏉ョ湅鐪嬪亣濡備笉鐢?span>MJORM鑰岀洿鎺ヤ嬌鐢?0gen鐨凧ava椹卞姩錛屽浣曚嬌鐢?/span>createObject
鏂規硶錛?/span>
Book book = new Book();
book.setIsbn("1594743061");
book.setTitle("MongoDB is fun");
book.setDescription("...");
DBObject bookObj = BasicDBObjectBuilder.start()
.add("isbn", book.getIsbn())
.add("title", book.getTitle())
.add("description", book.getDescription())
.get();
// 'db' is our DB object from earlier
DBCollection col = db.getCollection("books");
col.insert(bookObj);
ObjectId id = ObjectId.class.cast(bookObj.get("_id"));
System.out.println(id.toStringMongod()); // 4f96309f762dd76ece5a9595
涓嬮潰榪涜瀵硅薄鐨勬煡璇?span>:
Book book = dao.readObject("books", "4f96309f762dd76ece5a9595", Book.class);
System.out.println(book.getTitle()); // "MongoDB is fun"
readObject
鏂規硶鏍規嵁緇欏畾鏂囨。鐨刬d浠庢寚瀹氱殑闆嗗悎涓鍙栨枃妗o紝杞崲涓哄璞★紙鍐嶆浣跨敤鏄犲皠鏂囦歡錛夊茍榪斿洖銆?/span>
鏁忛攼鐨勮鑰呬細娉ㄦ剰鍒?span>Book榪樻病鏈夋寚瀹欰uthor錛屼粛鐒朵繚瀛樹簡銆傝繖褰掑拵浜嶮ongoDB鐨勭粨鏋勪笉鏁忔劅鐨勭壒鎬с傛垜浠笉鑳借姹傞泦鍚堜腑鐨勬枃妗e寘鍚墍鏈夊睘鎬э紙id灞炴ф槸蹇呴』鐨勶級錛屾墍鏈夊湪MongoDB涓病鏈堿uthor鐨凚ook鏄彲浠ョ殑銆傛垜浠幇鍦ㄤ負Book娣誨姞涓涓狝uthor騫朵笖鏇存柊涓涓嬶細
Author author = new Author();
author.setFirstName("Brian");
author.setLastName("Dilley");
book.setAuthor(author);
dao.updateObject("books", "4f96309f762dd76ece5a9595", book);
鐜板湪Book灝卞寘鍚簡Author錛屽茍涓斿湪MongoDB涓寔涔呭寲浜嗐傜幇鍦ㄥ湪鍛戒護琛屾煡鐪嬩簡Book錛?/span>
> db.books.find({_id:ObjectId("4f96309f762dd76ece5a9595")}).pretty()
{
"_id": ObjectId("4f96309f762dd76ece5a9595"),
"isbn": "1594743061",
"title": "MongoDB is fun",
"description": "..."
"author": {
"firstName": "Brian",
"lastName": "Dilley"
}
}
鍙互鐪嬪埌鎸佷箙鍖栫殑Book涓凡緇忓寘鍚簡author銆備笉浣跨敤MJORM鏉ユ搷浣滀竴閬嶏細
Author author = new Author();
author.setFirstName("Brian");
author.setLastName("Dilley");
book.setAuthor(author);
DBObject bookObj = BasicDBObjectBuilder.start()
.add("isbn", book.getIsbn())
.add("title", book.getTitle())
.add("description", book.getDescription())
.push("author")
.add("firstName", author.getFirstName())
.add("lastName", author.getLastName())
.pop()
.get();
DBCollection col = db.getCollection("books");
col.update(new BasicDBObject("_id", bookObj.get("_id")), bookObj);
瀵逛簬MongoDao
鏂規硶鐨勬繁鍏ヨ璁哄凡緇忚秴鍑轟簡鏈枃鐨勮寖鍥淬傚浜庡皢MJORM鏈夊叴瓚g敤浜庡疄闄呴」鐩腑鐨勭敤鎴峰己鐑堝緩璁簡瑙d竴涓婱JORM欏圭洰鎻愪緵鐨勭浉鍏蟲枃妗o紝鎴栬?/span>MongoDao
鎺ュ彛鎻愪緵鐨勭浉鍏崇敤娉曘?/span>
甯屾湜榪欑瘒鏂囩珷瀵?span>MongoDB鍜孧JORM鐨勪寒鐐規湁鎵灞曠ず銆侻ongDB鏄竴涓紭縐鐨勫憙NoSQL鏁版嵁瀛樺偍錛屾湁鐫澶ч噺浼樼鐨勭壒鎬э紝浼氭槸NoSQL甯傚満涓暱鏈熺珵浜夎呫傝嫢浣犱細鍦ㄤ竴涓狫ava欏圭洰涓嬌鐢∕ongoDB錛屽笇鏈涗綘涔熻兘澶熻冭檻浣跨敤MJORM浣滀負浣犵殑ORM妗嗘灦銆傚崄鍒嗘榪庡ぇ瀹舵彁浜ょ壒鎬ч渶姹傘侀敊璇紓甯告姤鍛娿佹枃妗e拰婧愮爜淇銆?/span>
Brian Dilley 鏄竴涓粡楠屼赴瀵岀殑楂樼駭宸ョ▼甯堜互鍙婇」鐩瀵鹼紝鍦?/span>Java/Java EE /Spring Framework/Linux鍐呴儴緇撴瀯鐞嗚В鍜岀鐞嗘湁鐫瓚呰繃13騫寸殑緇忛獙銆?/span>Brian瀵逛簬鍒涗笟鍏徃鏈夊緢澶氱粡楠岋紝鎺ㄥ悜甯傚満錛屾瀯寤?/span>/緇存姢浜у搧絳夈備粬鏄?/span>Iaas銆?/span>cloud銆?/span>PHP鍜?/span>Linux鐨勪笓瀹訛紝鐔熸倝浜у搧鐨勯噰璐佸畨瑁呭強閰嶇疆瀹氫箟錛屼互鍙婂叕鍙哥殑杞‖浠舵灦鏋勫寘鎷礋杞藉潎琛°佹暟鎹簱銆佸井鍗氱瓑銆傚彲浠?/span>follow Brian鐨?/span> Twitter 銆?/span>