MongoDB脚本

2017-12-12

记录MongoDB日常使用到的脚本

建立复合索引

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

1 为指定按升序创建索引

-1 为降序来创建索引

查看今日爬虫状态

/*
* 查看今日爬虫状态
* 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();

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

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

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' => array(1,2,9)));
//字段不等于哪些值
$querys = array("number"=>array('$nin' => array(1,2,9)));
//使用正则查询
$querys = array("name"=>  new MongoRegex("/.*".$name.".*/i"));
//或
$querys = array('$or' => array(array('number'=>2),array('number'=>9)));
?>

运维脚本

备份整个数据库

#!/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