首页 > MongoDB基础实例

MongoDB基础实例

2014-02-16   hisenKing

安装

./mongod --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/dblogs --fork

不能使用kill -9 pid 会形成锁文件。导致无法启动,需要在data目录下删除mongodb.lock


使用

bin目录下的
./mongo
show dbs 查看数据库
show tables 或者show collections 查看集合
db 查看当前使用的db
db.c1.insert({name:"hisen"}); 在当前数据库生成c1集合,插入一条文档
db.c1.save({_id:1,name:"hisen"}); id相同的时候,主键不存在save则插入,主键存在则更新。而insert会报主键冲突


db.c1.remove() 删除集合,后面加上条件则指定删除某条记录db.c1.remove({name:"hisen"})


db.c1.find() 查看文档信息,后面添加条件则查找指定的记录db.c1.find({name:"hisen"})
db.c1.findone() 查找一条
db.c1.find({},{name:0}) 查找除name字段之外的所有字段
db.c1.find({},{name:1}) 查找只有name的字段
db.c1.find({age:{$gt:20}}) 查找年龄大于20的,大于等于 $gte, $ne不等于
db.c1.find({age:{$lt:20}}) 查找年龄大于20的,小于等于 $lte
db.c1.find().count() 查找记录条数
db.c1.find().sort({age:1}) 按照年龄进行升序查找,-1:为降序
db.c1.find().limit(10) 返回10条记录
db.c1.find().skip(10).limit(10) 取第10条记录之后的10条记录,类似sql的limit(10,10)
db.c1.find().sort({age:1}).skip(10).limit(10) 安装age排序的分页
db.c1.find({post:{$all:[10,22,30]}}) 查找post字段同时包含10,22,30的信息
db.c1.find({age:{$exists:1}}) 包含age字段的信息,0为不包含
db.c1.find({age:{$mod:[2,1]}}) 取年龄除2余1的信息
db.c1.find({age:{$in:[20,22]}}) 取年龄20,22的信息,$nin为不在
db.c1.find({$or:[{name:"hisen"},{name:"hisenKing"}]}) 去姓名为hisen,hisenKing的信息。$nor则为反
db.c1.find({post:{$size:4}}) post的数字个数为4的
db.c1.distinct("name")
db.c1.find({age:{$type:10}}) 查找age的值为null的信息,或者使用db.c1.find({age:{$exists:1,$in:[null]}})


db.collection.update(criteria,objNew, upsert, multi)
参数说明
criteria:用于设置查询条件的对象
objNew:用于设置更新内容的对象
upsert:如果记录已经存在,更新它,否则新增一条记录
multi:如果有多个符合条件的记录,全部更新
注意:默认情况下,只会更新第一个符合条件的记录


db.c1.update({name:"hisen"},{name:"hisenKing"}) 这样会使原来name为hisen这条记录,其它的字段丢失。如果需要保留则使用
db.c1.update({name:"chenjiang"},{$set:{name:"chencai"}})。同样的添加字段也是使用set方式
db.c1.update({name:"chenjiang"},{$set:{sex:"girl"}})


db.c1.update({name:"chenjiang"},{$inc:{age:10}}) 在原来age的基础上加上10,没有的字段则添加
db.c1.update({name:"chenjiang"},{$unset:{age:true}}) 没有删除唯一字段_id
db.c1.update({name:"chenjiang"},{$push:{post:100}}) 在字段post的数组中添加一个值100
db.c1.update({name:"chenjiang"},{$pushAll:{post:[100,200,300]}}) 在字段post的数组中添加一个值100;如果使用push的话,是插入一个子集
db.c1.update({name:"chenjiang"},{$addtoset:{post:100}}) 如果存在100,则不插入,否则插入
db.c1.update({name:"chenjiang"},{$addtoset:{post:{$each:[100,150,200]}}}) 批量操作
db.c1.update({name:"chenjiang"},{$pop:{post:1}}) 删除post的最后一个值 ,-1为第一个
db.c1.update({name:"chenjiang"},{$pull:{post:100}}) 删除数组中的值 ,pullAll批量删除
db.c1.update({name:"chenjiang"},{$rename:{name:"nice"}}) 修改字段的名称


建立索引

db.c1.getIndexKeys() 查看索引
db.c1.ensureIndex({name:1}) 在字段name上建立升序的索引,-1为降序
db.c1.ensureIndex({name:1},{unqiue:1}) 建立唯一索引
db.c1.dropIndex({name:1}) 删除索引


导出数据

./mongoexport -d test -c c1 -o /tmp/c1.out


导入

./mongoimport -d test -c c1 /tmp/c1.out


数据备份

./mongodump -d test -o /tmp/


数据还原

./mongorestore -d test /tmp/test


用户授权认证

use admin
db.addUser("root","123456") // 退出重新登陆admin
./mongo -uroot -p123456 localhost:27017/admin


主从配置

./mongod --master --dbpath=/usr/local/mongodb/data1/ --logpath=/usr/local/mongodb/dblogs1 --fork --port 21000
./mongod --slave --source localhost:21000 --dbpath=/usr/local/mongodb/data2/ --logpath=/usr/local/mongodb/dblogs2 --fork --port 22000


登陆

./mongo --port 20001


从服务需要查看要加db.slaveOk()


用户授权方式启动mongo

./mongod --auth --dbpath=/usr/local/mongodb/data/ --logpath=/usr/local/mongodb/dblogs --fork


创建admin的账户信息

use admin
db.addUser("root","123456") // 退出重新登陆admin
./mongo -uroot -p123456 localhost:27017/admin


给数据库创建管理用户

use test
db.addUser("user1","123456") // 退出重新登陆test
./mongo -uuser1 -p123456 localhost:27017/test


php链接mongo

db.c1.find()
{ "_id" : ObjectId("523e10bb213d334dc7f470fe"), "name" : "chencai" }
{ "_id" : ObjectId("523e0d65213d334dc7f470fd"), "name" : "hisenKing" }
{ "_id" : ObjectId("523e132a213d334dc7f470ff"), "name" : "chencai" }
{ "_id" : ObjectId("523e135b213d334dc7f47100"), "name" : "chencai", "age" : 25 }
{ "_id" : ObjectId("523e1c647ec0348bb019f872"), "name" : "chen", "age" : 22 }

$m = new Mongo('mongodb://user2:123456@localhost:27017/test');  
$db = $m->test;
$c1 = $db->c1;
$arr = array();
$data = $c1->find($arr)->sort(array('name'=>1))->skip(2)->limit(2);
var_dump(iterator_to_array($data));

// 聚合count,distinct
$num = $c1->find($array)->count();
$data = $db->command(array("distinct" => "c1", "key" => "name"));
print_r($data['values']);


// 指定where查找
$array = array('name' => 'chencai');
$data = $c1->find($array);
print_r(iterator_to_array($data));

// 指定id查找
$id = new mongoId('523e135b213d334dc7f47100');
$array = array('_id' => $id);
$data = $c1->find($array);
print_r(iterator_to_array($data));

// 插入数据
$arr = array("name"=>"hisenking","age"=>"29","sex"=>"man");
if($c1->insert($arr)){
        echo 'ok';
}

// 删除
$arr = array("name"=>"chen");
if($c1->remove($arr)){
        echo 'ok';
}

// 更新
$arr = array("name"=>"hisenking", "age"=>"29", "sex" => "man");
$marr = array('$set' => array('sex'=>"nv"));
$opts = array("upsert"=>0, "multiple"=>1);
$data = $c1->update($arr, $marr, $opts);

参考资料

《MongoDB权威指南》

php手册

好久没更新了,需要除除草