mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理。关于它的一个最简洁描述为:scalable,high-performance,opensource,schema-free,document-orienteddatabase。MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。
安装及使用:
首先在Ubuntu上安装MongoDB。
下载MongoDB,现在最新的生产版本1.7.0
解压文件.$tar-xvfmongodb-linux-i686-1.4.3.tgz
为MongoDB创建数据目录,默认情况下它将数据存储在/data/db$sudomkdir-p/data/db/
$sudochown`id-u`/data/db
启动MongoDB服务.$cdmongodb-linux-i686-1.4.3/bin
$./mongod
打开另一个终端,并确保你在MongoDB的bin目录,输入如下命令.$./mongo
一些概念
一个mongod服务可以有建立多个数据库,每个数据库可以有多张表,这里的表名叫collection,每个collection可以存放多个文档(document),每个文档都以BSON(binaryjson)的形式存放于硬盘中,因此可以存储比较复杂的数据类型。它是以单文档为单位存储的,你可以任意给一个或一批文档新增或删除字段,而不会对其它文档造成影响,这就是所谓的schema-free,这也是文档型数据库最主要的优点。跟一般的key-value数据库不一样的是,它的value中存储了结构信息,所以你又可以像关系型数据库那样对某些域进行读写、统计等操作。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。Mongo还可以解决海量数据的查询效率,根据官方文档,当数据量达到50GB以上数据时,Mongo数据库访问速度是MySQL10倍以上。BSON
BSON是BinaryJSON的简称,是一个JSON文档对象的二进制编码格式。BSON同JSON一样支持往其它文档对象和数组中再插入文档对象和数组,同时扩展了JSON的数据类型。如:BSON有Date类型和BinDate类型。
BSON被比作二进制的交换格式,如同ProtocolBuffers,但BSON比它更“schema-less”,非常好的灵活性但空间占用稍微大一点。
BSON有以下三个特点:
1.轻量级
2.跨平台
3.效率高
命名空间
MongoDB存储BSON对象到collections,这一系列的数据库名和collection名被称为一个命名空间。如同:java.util.List;用来管理数据库中的数据。
索引
mongodb可以对某个字段建立索引,可以建立组合索引、唯一索引,也可以删除索引,建立索引就意味着增加空间开销。默认情况下每个表都会有一个唯一索引:_id,如果插入数据时没有指定_id,服务会自动生成一个_id,为了充分利用已有索引,减少空间开销,最好是自己指定一个unique的key为_id,通常用对象的ID比较合适,比如商品的ID。shell操作数据库:
超级用户相关:
#进入数据库admin
useadmin
#增加或修改用户密码db.addUser(name,pwd)
#查看用户列表db.system.users.find()
#用户认证db.auth(name,pwd)
#删除用户db.removeUser(name)
#查看所有用户showusers
#查看所有数据库showdbs
#查看所有的collectionshowcollections
#查看各collection的状态db.printCollectionStats()
#查看主从复制状态db.printReplicationInfo()
#修复数据库db.repairDatabase()
#设置记录profiling,0=off1=slow2=alldb.setProfilingLevel(1)
#查看profilingshowprofile
#拷贝数据库db.copyDatabase(mail_addr,mail_addr_tmp)
#删除collectiondb.mail_addr.drop()
#删除当前的数据库db.dropDatabase()
增删改
#存储嵌套的对象
db.foo.save({name:ysz,address:{city:beijing,post:100096},phone:[138,139]})
#存储数组对象db.user_addr.save({Uid:yushunzhi@sohu.com,Al:[test-1@sohu.com,test-2@sohu.com]})
#根据query条件修改,如果不存在则插入,允许修改多条记录db.foo.update({yy:5},{$set:{xx:2}},upsert=true,multi=true)
#删除yy=5的记录db.foo.remove({yy:5})
#删除所有的记录db.foo.remove()
索引
#增加索引:1(ascending),-1(descending)
db.foo.ensureIndex({firstname:1,lastname:1},{unique:true});
#索引子对象
db.user_addr.ensureIndex({Al.Em:1})
#查看索引信息
db.foo.getIndexes()
db.foo.getIndexKeys()
#根据索引名删除索引
db.user_addr.dropIndex(Al.Em_1)
查询
#查找所有
db.foo.find()
#查找一条记录
db.foo.findOne()
#根据条件检索10条记录
db.foo.find({msg:Hello1}).limit(10)
#sort排序
db.deliver_status.find({From:ixigua@sina.com}).sort({Dt,-1})
db.deliver_status.find().sort({Ct:-1}).limit(1)
#count操作
db.user_addr.count()
#distinct操作,查询指定列,去重复
db.foo.distinct(msg)
#”>=”操作
db.foo.find({"timestamp":{"$gte":2}})
#子对象的查找
db.foo.find({address.city:beijing})
管理
#查看collection数据的大小
db.deliver_status.dataSize()
#查看colleciont状态
db.deliver_status.stats()
#查询所有索引的大小
db.deliver_status.totalIndexSize()
advancedqueries:高级查询
条件操作符
$gt:>
$lt:<
$gte:>=
$lte:<=
$ne:!=、<>
$in:in
$nin:notin
$all:all
$not:反匹配(1.3.3及以上版本)查询name<>"bruce"andage>=18的数据
db.users.find({name:{$ne:"bruce"},age:{$gte:18}});查询creation_date>2010-01-01andcreation_date<=2010-12-31的数据
db.users.find({creation_date:{$gt:newDate(2010,0,1),$lte:newDate(2010,11,31)});查询agein(20,22,24,26)的数据
db.users.find({age:{$in:[20,22,24,26]}});查询age取模10等于0的数据
db.users.find(this.age%10==0);
或者
db.users.find({age:{$mod:[10,0]}});匹配所有
db.users.find({favorite_number:{$all:[6,8]}});
可以查询出{name:David,age:26,favorite_number:[6,8,9]}
可以不查询出{name:David,age:26,favorite_number:[6,7,9]}查询不匹配name=B*带头的记录
db.users.find({name:{$not:/^B.*/}});
查询age取模10不等于0的数据
db.users.find({age:{$not:{$mod:[10,0]}}});#返回部分字段
选择返回age和_id字段(_id字段总是会被返回)
db.users.find({},{age:1});
db.users.find({},{age:3});
db.users.find({},{age:true});
db.users.find({name:"bruce"},{age:1});
0为false,非0为true选择返回age、address和_id字段
db.users.find({name:"bruce"},{age:1,address:1});排除返回age、address和_id字段
db.users.find({},{age:0,address:false});
db.users.find({name:"bruce"},{age:0,address:false});数组元素个数判断
对于{name:David,age:26,favorite_number:[6,7,9]}记录
匹配db.users.find({favorite_number:{$size:3}});
不匹配db.users.find({favorite_number:{$size:2}});$exists判断字段是否存在
查询所有存在name字段的记录
db.users.find({name:{$exists:true}});
查询所有不存在phone字段的记录
db.users.find({phone:{$exists:false}});$type判断字段类型
查询所有name字段是字符类型的
db.users.find({name:{$type:2}});
查询所有age字段是整型的
db.users.find({age:{$type:16}});对于字符字段,可以使用正则表达式
查询以字母b或者B带头的所有记录
db.users.find({name:/^b.*/i});$elemMatch(1.3.1及以上版本)
为数组的字段中匹配其中某个元素Javascript查询和$where查询
查询age>18的记录,以下查询都一样
db.users.find({age:{$gt:18}});
db.users.find({$where:"this.age>18"});
db.users.find("this.age>18");
f=function(){returnthis.age>18}db.users.find(f);排序sort()
以年龄升序asc
db.users.find().sort({age:1});
以年龄降序desc
db.users.find().sort({age:-1});限制返回记录数量limit()
返回5条记录
db.users.find().limit(5);
返回3条记录并打印信息
db.users.find().limit(3).forEach(function(user){print(myageis+user.age)});
结果
myageis18
myageis19
myageis20限制返回记录的开始点skip()
从第3条记录开始,返回5条记录(limit3,5)
db.users.find().skip(3).limit(5);查询记录条数count()
db.users.find().count();
db.users.find({age:18}).count();
以下返回的不是5,而是user表中所有的记录数量
db.users.find().skip(10).limit(5).count();
如果要返回限制之后的记录数量,要使用count(true)或者count(非0)
db.users.find().skip(10).limit(5).count(true);分组group()
假设test表只有以下一条数据
{domain:"www.mongodb.org"
,invoked_at:{d:"2009-11-03",t:"17:14:05"}
,response_time:0.05
,http_action:"GET/display/DOCS/Aggregation"
}
使用group统计test表11月份的数据count:count(*)、total_time:sum(response_time)、avg_time:total_time/count;
db.test.group(
{cond:{"invoked_at.d":{$gt:"2009-11",$lt:"2009-12"}}
,key:{http_action:true}
,initial:{count:0,total_time:0}
,reduce:function(doc,out){out.count++;out.total_time+=doc.response_time}
,finalize:function(out){out.avg_time=out.total_time/out.count}
});[
{
"http_action":"GET/display/DOCS/Aggregation",
"count":1,
"total_time":0.05,
"avg_time":0.05
}
]Java应用示例
要使用Java操作MongoDB的话,要到官方网站下载一个驱动包,把包导入后,可以尝试来操作了(记得一定要开着服务器)
首先介绍一下比较常用的几个类
Mongo:连接服务器,执行一些数据库操作的选项,如新建立一个数据库等
DB:对应一个数据库,可以用来建立集合等操作
DBCollection:对应一个集合(类似表),可能是我们用得最多的,可以添加删除记录等
DBObjec:接口和BasicDBObject对象:表示一个具体的记录,BasicDBObject实现了DBObject,因为是key-value的数据结构,所以用起来其实和HashMap是基本一致的
DBCursor:用来遍历取得的数据,实现了Iterable和Iterator
接下来实际的操作一下,代码如下:
importjava.net.UnknownHostException;
importjava.util.List;
importjava.util.Set;
importcom.mongodb.BasicDBObject;
importcom.mongodb.DB;
importcom.mongodb.DBCollection;
importcom.mongodb.DBCursor;
importcom.mongodb.DBObject;
importcom.mongodb.Mongo;
importcom.mongodb.MongoException;
publicclassMongoDbTest{
publicstaticvoidmain(String[]args)throwsUnknownHostException,MongoException{
//Mongom=newMongo();
//Mongom=newMongo("localhost");
//获得数据库服务
Mongom=newMongo("localhost",27017);
//得到数据库mytest
DBdb=m.getDB("mytest");
//得到mytest数据库下所有表名
Setcolls=db.getCollectionNames();
for(Strings:colls){
System.out.println(s);
}
//得到testCollection表
DBCollectioncoll=db.getCollection("testCollection");
//new一个BasicDBObject对象doc
BasicDBObjectdoc=newBasicDBObject();
//赋值
doc.put("name","MongoDB");
doc.put("type","database");
doc.put("count",1);
//又new一个BasicDBObject对象info
BasicDBObjectinfo=newBasicDBObject();
info.put("x",203);
info.put("y",102);
//把info放入doc
doc.put("info",info);
//向testCollection表中插入一条数据
coll.insert(doc);
//查询一条数据
DBObjectmyDoc=coll.findOne();
System.out.println(myDoc);
//循环插入100条数据到testCollection
for(inti=0;i<100;i++){
coll.insert(newBasicDBObject().append("i",i));
}
//CountingDocumentsinACollection
System.out.println(coll.getCount());
//UsingaCursortoGetAlltheDocuments
DBCursorcur=coll.find();
while(cur.hasNext()){
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yczz/archive/2010/10/29/5974235.aspx
本文内容总结:
原文链接:https://www.cnblogs.com/cxd4321/archive/2011/06/24/2089051.html