MongoDB随笔基本操作
一、MongoDB数据结构与关系型数据库比较
逻辑结构对比
MongoDB
关系型数据库
文档(document)
行(row)
集合(collection)
表(table)
数据库(database) 数据库(database)
二、mongod 参数说明
最简单的,通过执行 mongod 即可以启动 MongoDB 数据库服务,mongod
支持很多的参数,但都有默认值,其中最重要的是需要指定数据文件路径,或者确保默认的/data/db
存在并且有访问权限,否则启动后会自动关闭服务。Ok,那也就是说,只要确保 dbpath 就可以启动
MongoDB 服务了
mongod的主要参数有:
dbpath:
数据文件存放路径,每个数据库会在其中创建一个子目录,用于防止同一个实例多次运行的 mongod.lock
也保存在此目录中。
logpath
错误日志文件
logappend
错误日志采用追加模式(默认是覆写模式)
bind_ip
对外服务的绑定
ip,一般设置为空,及绑定在本机所有可用 ip 上,如有需要可以单独指定
port
对外服务端口。Web 管理端口在这个 port
的基础上+1000
fork
以后台 Daemon
形式运行服务
journal
开启日志功能,通过保存操作日志来降低单机故障的恢复时间, 1.8 版本后正式加入,在取代在 1.7.5 版本中的
dur 参数。
syncdelay
系统同步刷新磁盘的时间,单位为秒,默认是 60 秒。
directoryperdb
每个 db
存放在单独的目录中,建议设置该参数。与 MySQL 的独立表空间类似
maxConns
最大连接数
repairpath
执行
repair 时的临时目录。在如果没有开启 journal,异常 down 机后重启,必须执行 repair操作。
三、简单查询:
db.c1.find();
c1:集合名称
db.things.findOne({name:"mongo"});
db.things.find().limit(3);
简单修改:
db.things.update({name:"mongo"},{$set:{name:"mongo_new"}});
db.things.remove({name:"mongo_new"});
复杂查询:
条件操作符
<, <=, >, >=
这个操作符就不用多解释了,最常用也是最简单的
db.collection.find({ "field" : { $gt: value } } ); //
大于:field > value
db.collection.find({ "field" : { $lt: value } } );//
小于:field < value
db.collection.find({ "field" : { $gte: value } } ); //
大于等于: field >= value
db.collection.find({ "field" : { $lte: value } } );
// 小于等于: field <= value
如果要同时满足多个条件,可以这样做
db.collection.find({ "field"
: { $gt: value1, $lt: value2 } } );// value1 < field < value
$all 匹配所有
这个操作符跟 SQL 语法的 in 类似,但不同的是, in 只需满足( )内的某一个值即可, 而$all 必须满足[
]内的所有值,例如:
db.users.find({age : {$all : [6, 8]}});
可以查询出 {name: ‘David‘,
age: 26, age: [ 6, 8, 9 ] }
但查询不出 {name: ‘David‘, age: 26, age: [ 6, 7, 9 ]
}
$exists 判断字段是否存在
查询所有存在 age 字段的记录
db.users.find({age: {$exists: true}});
查询所有不存在 name
字段的记录
db.users.find({name: {$exists: false}});
查询存在字段 age
的数据
db.c1.find({age:{$exists:true}});
null处理
db.c2.find({age:{"$in":[null], "$exists":true}});
$mod取模运算
db.c1.find({age: {$mod : [ 6 , 1 ] } });
$ne 不等于
db.c1.find( { age : { $ne : 7 } } );
$in包含
查询 age 的值在 7,8 范围内的数据
db.c1.find({age:{$in: [7,8]}});
$nin不包含
查询 age 的值在 7,8 范围外的数据
db.c1.find({age:{$nin: [7,8]}});
正则表达式匹配
db.c1.find({name: {$not: /^T.*/}});
Javascript 查询和$where 查询
db.c1.find( { a : { $gt: 3 } } );
db.c1.find( { $where: "this.a >
3" } );
db.c1.find("this.a > 3");
f = function() { return this.a >
3; } db.c1.find(f);
count 查询记录条数
db.c1.count();
skip 限制返回记录的起点
查询 c1 表的第 2 条数据
db.c1.find().skip(1).limit(1)
sort 排序
查询 c1 表按 age 升序排列
db.c1.find().sort({age: 1});
查询 c1 表按 age
降序排列
db.c1.find().sort({age: -1});
游标来循环处理每一条结果数据,具体语法如下:
for( var c = db.t3.find(); c.hasNext(); ) {
...
printjson(
c.next());
... }
MongoDB 还有另一种方式来处理游标
db.t3.find().forEach( function(u) { printjson(u); }
);
四、存储过程
MongoDB
为很多问题提供了一系列的解决方案,针对于其它数据库的特性,它仍然毫不示弱,表现的非比寻常。MongoDB
同样支持存储过程。关于存储过程你需要知道的第一件事就是它是用 javascript 来写的。也许这会让你很奇怪,为什么它用 javascript
来写,但实际上它会让你非常满意,MongoDB 存储过程是存储在 db.system.js 表中的,我们想象一个简单的 sql
自定义函数如下:
db.system.js.save({_id:"addNumbers", value:function(x, y){
return x + y; }});
存储过程可以被查看,修改和删除,所以我们用 find
来查看一下是否这个存储过程已经被创建上了。
db.system.js.find()
结果:
{ "_id" : "addNumbers",
"value" : function cf__1__f_(x, y) {
return x +
y;
}}
db.eval()是一个比较奇怪的东西,我们可以将存储过程的逻辑直接在里面并同时调用,而无需事先声明存储过程的逻辑。
db.eval(‘addNumbers(3,
4.2)‘);
结果:7.2
从上面可以看出,MongoDB
的存储过程可以方便的完成算术运算,但其它数据库产品在存储过程中可以处理数据库内部的一些事情,例如取出某张表的数据量等等操作,这些MongoDB
能做到吗?答案是肯定的,MongoDB 可以轻而易举的做到,看下面的实例吧:
db.system.js.save({_id:"get_count",
value:function(){ return db.c1.count(); }});