MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可护展的高性能数据存储解决方案。 它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有: *面向集合存储,易存储对象类型的数据。 *模式自由。 *支持动态查询。 *支持完全索引,包含内部对象。 *支持查询。 *支持复制和故障恢复。 *使用高效的二进制数据存储,包括大型对象(如视频等)。 *自动处理碎片,以支持云计算层次的扩展性 *支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。 *文件存储格式为BSON(一种JSON的扩展) *可通过网络访问 所谓“面向集合”(Collenction-Oriented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。 模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。 存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各种复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized dOcument Format)。 MongoDB服务端可运行在Linux、Windows或OS X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB在32位模式运行时支持的最大文件尺寸为2GB。
MongoDB对MySQL常用的SQL语句对应的实现 —————————————— MySQL: SELECT * FROM user Mongo: db.user.find() —————————————— MySQl: SELECT * FROM user WHERE name = 'foobar' Mongo: db.user.find({ 'name' : 'foobar' }) —————————————— MySql: INSERT INTO user ('name','age') VALUES ('foobar',25) Mongo: db.user.insert({ 'name' : 'foobar' , 'age' : 25}) —————————————— 如果想增加email这一列 MySql: ALTER TABLE user ... Mongo: db.user.insert({ 'name' : 'foobar' , 'age' : 25 , 'email' : '[email protected]' }) —————————————— MySql: DELETE * FROM user Mongo: db.user.remove({}) —————————————— MySql: DELETE FROM user WHERE age < 30 Mongo: db.user.remove({ 'age' : {$lt : 30}}) $gt:> ; $gte:>= ; $lt:< ; $lte:<= ; $ne:!= —————————————— MySql: UPDATE user SET `age` = 36 WHERE `name` = 'foobar' Mongo: db.user.update({ 'name' : 'foobar'} , {$set : { 'age' : 36}}) —————————————— MySQL: UPDATE user SET `age` = 'age' + 3 WHERE `name` = 'foobar' Mongo: db.user.update({ 'name' : 'foobar'} , {$inc : {'age' : 3}}) —————————————— MySQl: SELECT COUNT(*) FROM user WHERE `name` = 'foobar' Mongo: db.user.find({ 'name' : 'foobar'}).count() —————————————— MySql: SELECT * FROM user limit 10,20 Mongo: db.user.find().skip(10).limit(20) —————————————— MySQl: SELECT * FROM user WHERE `age` IN (25,35,45) Mongo: db.user.find({ 'age' : {$in : [25,35,45]}}) —————————————— MySql: SELECT * FROM user ORDER BY age DESC Mongo: db.user.find().sort({ 'age' : -1}) —————————————— MySQL: SELECT DISTINCT(name) FROM user WHERE age > 20 Mongo: db.user.distinct( 'name',{'age' : {$lt : 20}}) —————————————— MySQL: SELECT name, sum(marks) FROM user GROUP BY name Mongo: db.user.group({ key:{'name':true}, cond:{'name':'foo'}, reduce:function(obj,prev){prev.msum += obj.marks;}, initial:{msum : 0} }) —————————————— MySQL: SELECT name FROM user WHERE age < 20 Mongo: db.user.find('this.age < 20' , {name : 1})
该文档是翻译自文档[mongodb-docs-2010-10-24.pdf]的[Java Language Center]章节,根据自己的理解整理而成。 希望能给像我这样开始接触的朋友一点帮助,同时也做个备忘,因为是刚刚学习,其中的很多功能目前都用不上,以后万一有什么功能不太清楚,也可以直接查阅该文档了。 MongoDB Java Driver 简单操作 一、Java驱动一致性 MongoDB的Java驱动是线程安全的,对于一般的应用,只要一个Mongo实例即可,Mongo有个内置的连接池(池大小默认为10个)。 对于有大量写和读的环境中,为了确保在一个Session中使用同一个DB时,我们可以用以下方式保证一致性: DB mdb = mongo.getDB('dbname'); mdb.requestStart(); // // 业务代码 // mdb.requestDone(); DB和DBCollection是绝对线程安全的,它们被缓存起来了,所以在应用中取到的可能是同一个对象。 二、保存/查找对象(DBObject) Java驱动提供了DBObject接口,方便我们保存对象到数据库中。 定义需要保存的对象: public class Tweet implements DBObject { /** ...... */ } 然后我们可以使用该对象: Tweet tweet = new Tweet(); tweet.put("user", userId); tweet.put("message", message); tweet.put("date", new Date()); collection.insert(tweet); 当从数据库中查询时,结果会自动的转换成DBObject对象,我们可以转换成我们自己的类型: collection.setObjectClass(Tweet); Tweet myTweet = (Tweet)collection.findOne(); 三、创建连接 Mongo m = new Mongo(); Mongo m = new Mongo("localhost"); Mongo m = new Mongo("localhost", 27017); DB db = m.getDB("mydb); 注意:事实上,Mongo实例代表了一个数据库连接池,即使在多线程的环境中,一个Mongo实例对我们来说已经足够了。 四、认证(可选的) boolean auth = db.authenticate("myUserName", "myPasswd"); 五、取得Collection列表 Set<String> colls = db.getCollectionNames(); for(String s : colls) { System.out.prinln(s); } 六、获取一个Collection DBCollection coll = db.getCollection("testCollection"); 使用DBCollection,我们可以进行插入、查询数据等数据操作。 七、插入文档 假设有个JSON文档如下所示: { "name": "MongoDB", "type": "database", "count": 1, "info": { x: 203, y: 102 } } 注意:上面的JSON文档有个内嵌文档"info"。 我们完全可以利用BasicDBObject来创建一个和上面的JSON一样的文档,并且把它保存在MongoDB中。 DBObject doc = new BasicDBObject(); doc.put("name", "MongoDB"); doc.put("type", "database"); doc.put("count", 1); DBObject info = new BasicDBObject(); info.put("x", 203); info.put("y", 102); doc.put("info", info); coll.insert(doc); 八、查询第一个文档(findOne()) 为了验证在上面我们保存的类似JSON的数据,我们可以用findOne()方法取得数据。 findOne(): 返回一个文档; find(): 返回一个游标(DBCursor),其中包含一组对象DBObject; DBObject doc = coll.findOne(); System.out.println(doc); 我们将会看到控制台输出: { "_id" : "49902cde5162504500b45c2c" , "name" : "MongoDB" , "type" : "database" , "count" : 1 , "info" : { "x" : 203 , "y" : 102} , "_ns" : "testCollection"} 九、插入多个文档 为了在后来展示更多的查询方法,我们先插入几个文档,它们的JSON像这样: { "i": value } 使用一个循环插入数据: for(int i = 0; i < 100; i++) { coll.insert(new BasicDBObject().append("i", i)); } 我们注意到,同一个coll,我们完全可以插入不同风格的数据,这就是MongoDB的重要特性“模式自由”。 十、统计文档数 现在我们已经有101份文档在数据库中了,现在统计一下看是否正确。 long count = coll.getCount(); System.out.println(count); 控制台将会输出:101 十一、使用游标取得所有的文档 DBCursor cursor = coll.find(); while(cursor.hasNext()) { DBObject object = cursor.next(); System.out.println(object); } 十二、查询单个文档 DBObject query = new BasicDBObject(); query.put("i", 71); cursor = coll.find(query); while(cur.hasNext()) { DBObject object = cursor.next(); System.out.println(object); } 控制台的输出类似如下: { "_id" : "49903677516250c1008d624e" , "i" : 71 , "_ns" : "testCollection"} 十三、查询文档集合 根据查询条件,我们可以通过DBCollection从数据库中取出多个对象,比如查询i>50的文档集合: query = new BasicDBObject(); query.put("i", new BasicDBObject("$gt", 50)); // i>50 cursor = coll.find(query); while(cursor.hasNext()) { DBObject object = cursor.next(); System.out.println(object); } 比如查询条件为 20<i<=30: query = new BasicDBObject(); // 20<i<=30 query.put("i", new BasicDBObject("$gt", 20).append("$lte", 30)); cursor = coll.find(query); while(cursor.hasNext()) { DBObject object = cursor.next(); System.out.println(object); } 十四、创建索引 MongoDB支持索引,并且给一个DBCollection添加索引非常简单,你只要指明需要创建索引的字段,然后指明其是升序(1)还是降序(-1)即可,比如在"i"上创建升序索引。 coll.createIndex(new BasicDBObject("i", 1)); // 1代表升序 十五、查询索引 我们可以查询到所有的索引: List<DBObject> list = coll.getIndexInfo(); for(DBObject index : list){ System.out.println(index); } 控制台的输出类似如下所示: { "name" : "i_1" , "ns" : "mydb.testCollection" , "key" : { "i" : 1} , "_ns" : "system.indexes"} MongoDB的管理功能 一、获取所有的数据库 Mongo m = new Mongo(); for(String s : m.getDatabaseNames()) { System.out.println(s); } 二、删除数据库 m.dropDatabase("my_new_db"); MongoDB的Java类型 一、对象ID ObjectId被用作自动生成的唯一ID. ObjectId id = new ObjectId(); ObjectId copy = new ObjectId(id); 二、正则表达式 Pattern john = Pattern.compile("joh?n", CASE_INSENSITIVE); DBObject query = new BasicDBObject("name", john); // 查询所有 "name" 匹配 /joh?n/i 的文档 DBCursor cursor = collection.find(query); 三、日期和时间 Date now = new Date(); DBObject time = new BasicDBObject("ts", now); collection.save(time); 四、数据库引用 DBRef可以用来保存数据库引用。 DBRef addressRef = new DBRef(db, "foo.bar", address_id); DBObject address = addressRef.fetch(); DBObject person = BasicDBObjectBuilder.start() .add("name", "Fred") .add("address", addressRef) .get(); collection.save(person); DBObject fred = collection.findOne(); DBRef addressObj = (DBRef)fred.get("address"); addressObj.fetch(); 五、二进制数据 字节数组(byte[])被当作二进制数据。 六、内嵌文档 JSON样式的数据如下: { "x": { "y": 3 } } 则在MongoDB中,Java表示为: DBObject y = new BasicDBObject("y", 3); DBObject x = new BasicDBObject("x", y); 七、数组 任何继承自List的对象,在MongoDB中,都被当成是数组。 如果想表示如下JSON数据: { "x": [ 1, 2, {"foo": "bar"}, 4 ] } 则在Java中,应该为: List<Object> x = new ArrayList<Object>(); x.add(1); x.add(2); x.add(new BasicDBObject("foo", "bar")); x.add(4); DBObject doc = new BasicDBObject("x", x); System.out.println(doc); ===========================================
参考文档:http://baike.baidu.com/view/3385614.htm
http://www.iteye.com/topic/795012
http://datalife.iteye.com/blog/804762