mongodb常用命令
本文内容纲要:
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
$sudomkdir-p/data/db/
$sudochown`id-u`/data/db
$cdmongodb-linux-i686-1.4.3/bin
$./mongod
$./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
showcollections
db.printCollectionStats()
db.printReplicationInfo()
db.repairDatabase()
db.setProfilingLevel(1)
showprofile
db.copyDatabase('mail_addr','mail_addr_tmp')
db.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']})
db.foo.update({'yy':5},{'$set':{'xx':2}},upsert=true,multi=true)
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-01'andcreation_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数据库下所有表名
Set
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