MongoDB

2017-12-12

代码段

查看今日爬虫状态

/*
* 查看今日爬虫状态
* BY: http://malu.me/
*/
var date = new Date();
var bb = date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate();
function getcount(){
    var collection_list = db.getCollectionInfos({"name":/BR_/});  // 列出前包含BR_的Collection
    for ( var i=0;i<collection_list.length;i++ ){
        table = collection_list[i]['name'];
        ok = db.getCollection(table).find({'product_info': {$ne:""},"date":bb,"source":"TB"}).count();
        no = db.getCollection(table).find({'product_info': "","date":bb,"source":"TB"}).count();
        print(table, ok+'/'+no);
    }
}
getcount();

PHP模糊查询 old

<?php
   // 连接到mongodb
   $m = new MongoClient("xxx.malu.me:123456");
   // 选择一个数据库
   $db = $m->mydb;
   // 认证登录
   $db->authenticate('username', 'passwd');
   // 选择一个表
   $collection = $db->user;
   $name = 'python';
   $query = array('title' => new MongoRegex("/.*".$name.".*/i"));
   $cursor = $collection->find($query);
   // 迭代显示文档标题
   // var_dump($cursor);
   foreach ($cursor as $document) {
      echo $document["title"] . "\n";
   }
?>

PHP mongoDB常用查询

<?php
//字段字串为
$querys = array"name"=>"malu");
//数值等于多少
$querys = array"number"=>7);
//数值大于多少
$querys = array"number"=>array'$gt' => 5));
//数值大于等于多少
$querys = array"number"=>array'$gte' => 2));
//数值小于多少
$querys = array"number"=>array'$lt' => 5));
//数值小于等于多少
$querys = array"number"=>array'$lte' => 2));
//数值介于多少
$querys = array"number"=>array'$gt' => 1'$lt' => 9));
//数值不等于某值
$querys = array"number"=>array'$ne' => 9));
//使用js下查询条件
$js ="function(){
return this.number == 2 && this.name == 'shian';
}";
$querys = array'$where'=>$js);
//字段等于哪些值
$querys = array"number"=>array'$in' => array1,2,9)));
//字段不等于哪些值
$querys = array"number"=>array'$nin' => array1,2,9)));
//使用正则查询
$querys = array"name"=>  new MongoRegex("/.*".$name.".*/i"));
//或
$querys = array'$or' => arrayarray'number'=>2),array'number'=>9)));
?>

语句

建立复合索引

db.getCollection("bolg").createIndex({"source":1,"date":-1});

1 为指定按升序创建索引

-1 为降序来创建索引

创建唯一索引,并消除重复数据。

数字1表示userid键的索引按升序存储,-1表示userid键的索引按照降序方式存储。

> db.test.ensureIndex({"userid":1},{"unique":true,"dropDups":true}) 

注:如果存在其他键,那么删除重复会失败,需要手动删除。

聚合查询,统计重复个数

> db.runCommand({"distinct":"table_name","key":"field_name"})

# 查看非重复值个数
> db.getCollection("table_name").distinct('field_name').length

# 找出指定字段重复数
> db.AI_online.aggregate([{$group : {_id : "$title", num : {$sum : 1}}},{$match :{num:{$gt : 1}}},{$sort:{num:-1}}])

# 删除指定字段重复值,只保留一个(去重)
> db.AI_online.aggregate([
{
    $group: { _id: {title: '$title'},count: {$sum: 1},dups: {$addToSet: '$_id'}}
},
{
    $match: {count: {$gt: 1}}
}
]).forEach(function(doc){
    doc.dups.shift();
    db.AI_online.remove({_id: {$in: doc.dups}});
})

模糊查询

db.test_info.find({"tname": {$regex: '测试', $options:'i'}}) 

db.test_info.find({"tname": {$regex:/测试.*/i}})

模糊+或查询

db.test_info.find({"$or":[{"title":{$regex:/测试.*/i}},{"summary":{$regex:/测试.*/i}}]}) 

运维

mongodump常用参数

  • –db:指定导出的数据库
  • –collection:指定导出的集合
  • –excludeCollection:指定不导出的集合
  • –host :远程ip
  • –username:开启身份验证后,用户的登录名
  • –password:用户的密码
  • –out(指定输出目录):如果不使用这个参数,mongodump将输出文件保存在当前工作目录中名为dump的目录中
  • –archive:导出归档文件,最后只会生成一个文件
  • –gzip:压缩归档的数据库文件,文件的后缀名为.gz

备份整个数据库

#!/bin/bash
MY_PATH=$(cd "$(dirname "$0")"; pwd)
cd $MY_PATH
dd=`date '+%Y-%m-%d-%H%M%S'`
mongodump -o ./$dd --gzip --uri=mongodb://admin:passwd@localhost:27017/?authSource=admin

恢复整个数据库

mongorestore -h localhost:27017 --gzip --dir=backup_dir

归档

mongodump -h dbhost -d dbname --archive=dbname.dump.gz --gzip

还原

mongorestore <uri> --archive=dbname.dump.gz --gzip

迁移mongodb 3.4->3.6

可以采用直接拷贝数据库文件的方式进行。 拷贝文件需要停止数据库服务,停止后直接拷贝数据库文件目录中的数据即可。

注意事项:

1、.lock文件不要拷贝;
2、diagnostic.data的文件夹不要拷贝,如果拷贝,在新的数据库运行时会出现错误,需要修复,时间有点长。

mongodump和mongorestore来迁移数据库

备份:

mongodump -o /mongodbbackup/20180730/ --gzip -u admin -p password

恢复:

mongorestore --dir ./20180730/ --gzip

快速安装

apt-get install mongodb

启动

mongod -f /etc/mongodb.conf --fork   //使用配置文件启动,并后台执行

连接

mongo --host xx.xx.xx.xx --port 123

test数据库添加用户

use test
db.addUser("test","test")

登录

> use admin
switched to db admin
> db.auth("root","passwd")
1
> show dbs;
admin   0.000GB
local   0.000GB

添加超级管理员

db.createUser(
  { user: "admin",
    pwd: "admin",
    roles: [ { role: "root", db: "admin" } ]
  }
)

user字段,为新用户的名字;

pwd字段,用户的密码;

roles字段,指定用户的角色,可以用一个空数组给新用户设定空角色。在roles字段,可以指定内置角色和用户定义的角色。

内建的角色:

  1. 数据库用户角色:read、readWrite;
  2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
  3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
  4. 备份恢复角色:backup、restore;
  5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  6. 超级用户角色:root
  7. 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
  8. 内部角色:__system

角色参考:https://docs.mongodb.com/manual/reference/built-in-roles/#built-in-roles

添加DB读写用户

先建立一个DB,然后在该DB下执行shell:

db.createUser(
  { user: "spider",
    pwd: "spider",
    roles: [ { role: "readWrite", db: "spider" } ]
  }
)

windows下开启mongodb用户认证

修改配置文件:C:\Program Files\MongoDB\Server\3.4\mongod.cfg

添加:

security:
    authorization: enabled

然后重启服务

知识库

PHP Mongodb库手册

https://docs.mongodb.com/php-library/current/tutorial/

PHP Mongodb库官方文档

https://www.php.net/manual/zh/set.mongodb.php

windowns MongoDB client

Robomongo https://robomongo.org/

studio3t https://studio3t.com/download-now/

navicat-for-mongodb https://www.navicat.com/en/download/navicat-for-mongodb

windowns MongoDB server

下载地址:

https://www.mongodb.org/dl/win32/

安装教程:

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/

mongodump、mongorestore等工具下载

https://www.mongodb.com/try/download/database-tools