首页 文章资讯内容详情

mongodb常用命令

2026-06-01 4 花语

本文内容纲要:

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

#查看所有的collection

showcollections

#查看各collection的状态

db.printCollectionStats()

#查看主从复制状态

db.printReplicationInfo()

#修复数据库

db.repairDatabase()

#设置记录profiling,0=off1=slow2=all

db.setProfilingLevel(1)

#查看profiling

showprofile

#拷贝数据库

db.copyDatabase(mail_addr,mail_addr_tmp)

#删除collection

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]})

#根据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