mongodb常用命令.docx
《mongodb常用命令.docx》由会员分享,可在线阅读,更多相关《mongodb常用命令.docx(12页珍藏版)》请在冰豆网上搜索。
mongodb常用命令
mongodb常用命令
mongodb由C++写就,其名字来自humongous这个单词的中间部分,从名字可见其野心所在就是海量数据的处理。
关于它的一个最简洁描述为:
scalable,high-performance,opensource,schema-free,document-orienteddatabase。
MongoDB的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)以及传统的RDBMS系统(丰富的功能)架起一座桥梁,集两者的优势于一身。
一个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操作数据库:
一、超级用户相关:
1.进入数据库admin
useadmin
2.增加或修改用户密码
db.addUser('name','pwd')
3.查看用户列表
db.system.users.find()
4.用户认证
db.auth('name','pwd')
5.删除用户
db.removeUser('name')
6.查看所有用户
showusers
7.查看所有数据库
showdbs
8.查看所有的collection
showcollections
9.查看各collection的状态
db.printCollectionStats()
10.查看主从复制状态
db.printReplicationInfo()
11.修复数据库
db.repairDatabase()
12.设置记录profiling,0=off1=slow2=all
db.setProfilingLevel
(1)
13.查看profiling
showprofile
14.拷贝数据库
db.copyDatabase('mail_addr','mail_addr_tmp')
15.删除collection
db.mail_addr.drop()
16.删除当前的数据库
db.dropDatabase()
二、增删改
1.存储嵌套的对象
db.foo.save({'name':
'ysz','address':
{'city':
'beijing','post':
100096},'phone':
[138,139]})
2.存储数组对象
db.user_addr.save({'Uid':
'yushunzhi@','Al':
['test-1@','test-2@']})
3.根据query条件修改,如果不存在则插入,允许修改多条记录
db.foo.update({'yy':
5},{'$set':
{'xx':
2}},upsert=true,multi=true)
4.删除yy=5的记录
db.foo.remove({'yy':
5})
5.删除所有的记录
db.foo.remove()
三、索引
1.增加索引:
1(ascending),-1(descending)
db.foo.ensureIndex({firstname:
1,lastname:
1},{unique:
true});
3.索引子对象
db.user_addr.ensureIndex({'Al.Em':
1})
5.查看索引信息
db.foo.getIndexes()
7.db.foo.getIndexKeys()
8.根据索引名删除索引
9.db.user_addr.dropIndex('Al.Em_1')
四、查询
1.查找所有
2.db.foo.find()
3.查找一条记录
4.db.foo.findOne()
5.根据条件检索10条记录
6.db.foo.find({'msg':
'Hello1'}).limit(10)
7.sort排序
8.db.deliver_status.find({'From':
'ixigua@'}).sort({'Dt',-1})
9.db.deliver_status.find().sort({'Ct':
-1}).limit
(1)
10.count操作
11.db.user_addr.count()
12.distinct操作,查询指定列,去重复
13.db.foo.distinct('msg')
14.”>=”操作
15.db.foo.find({"timestamp":
{"$gte":
2}})
16.子对象的查找
17.db.foo.find({'address.city':
'beijing'})
五、管理
1.查看collection数据的大小
2.db.deliver_status.dataSize()
3.查看colleciont状态
4.db.deliver_status.stats()
5.查询所有索引的大小
6.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
接下来实际的操作一下,代码如下:
import.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;
public classMongoDbTest{
public static voidmain(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()){