MongoDB 远程连接 权限 CURD例子

一. 在Ubuntu下最傻瓜的步骤(以下都在root用户下进行操作):
MongoDB安装很简单,无需下载源文件,可以直接用apt-get命令进行安装。

sudo apt-get install mongodb

service --status-all | grep 'mongo*'
sudo service mongodb start

这时装好以后应该会自动运行mongod程序,通过"pgrep mongo -l "查看进程是否已经启动

mongodb远程连接配配置,分以下4步。

1,添加管理员账号

$ mongo
> use admin
switched to db admin
> db.addUser('tank','test');
#version 3.3
> db.createUser({user:'admin', pwd:'0rb!t', roles:[{ role: "dbOwner", db: "admin" }] });

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

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

2开启动用户权限认证

vim /etc/mongodb.conf
#bind_ip = 127.0.0.1     //注释此行
auth = true              //将此行前的注释去掉

 3,重启mongodb

/etc/init.d/mongodb restart  

 验证账号:

use admin
db.auth("admin", "0rb!t")

4,防火墙开放27017端口开放

iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 27017 -j ACCEPT  

MongoDB的可视化工具Navicat Premium 12,MongoDB不显示默认的系统库设置

php客户端连接
插入

<?php
//链接mongodb
$manager = new MongoDB\Driver\Manager('mongodb://admin:0rb!t@192.168.96.137:27017');

$bulk = new MongoDB\Driver\BulkWrite; //默认是有序的,串行执行
$bulk->insert([ 'user_id' => 2, 'real_name' => '中国' ]);
$bulk->insert([ 'user_id' => 3, 'real_name' => '中国人' ]);
$manager->executeBulkWrite('admin.box', $bulk); //执行写入admin数据库下的box集合

查询

<?php
//链接mongodb
$manager = new MongoDB\Driver\Manager('mongodb://admin:0rb!t@localhost:27017');
//查询
$filter = ['user_id' => ['$gt' => 0]]; //查询条件 user_id大于0
$options = [
    'projection' => ['_id' => 0], //不输出_id字段
    'sort' => ['user_id' => -1], //根据user_id字段排序 1是升序,-1是降序
];
$query = new MongoDB\Driver\Query($filter, $options); //查询请求
$list = $manager->executeQuery('admin.box', $query); // 执行查询 location数据库下的box集合
echo "<pre>";
foreach ($list as $document) {
    $document = (array) $document;
    print_r($document);
}

修改

<?php

$manager = new MongoDB\Driver\Manager('mongodb://admin:0rb!t@localhost:27017');
$bulk = new MongoDB\Driver\BulkWrite(); //默认是有序的,串行执行
//$bulk = new MongoDB\Driver\BulkWrite(['ordered' => flase]);//如果要改成无序操作则加flase,并行执行
$bulk->update(
    ['user_id' => 2],
    [
        '$set' => ['real_name' => '中国国'],
    ]
);
//$set相当于mysql的 set,这里和mysql有两个不同的地方,
//1:字段不存在会添加一个字段;
//2:mongodb默认如果条件不成立,新增加数据,相当于insert
//如果条件不存在不新增加,可以通过设置upsert
//db.collectionName.update(query, obj, upsert, multi);
$bulk->update(
    ['user_id' => 5],
    [
        '$set' => ['fff' => '中国国'],
    ],
    ['multi' => true, 'upsert' => false]
//multi为true,则满足条件的全部修改,默认为true,如果改为false,则只修改满足条件的第一条
//upsert为 treu:表示不存在就新增
);
$manager->executeBulkWrite('admin.box', $bulk);

删除

<?php
$manager = new MongoDB\Driver\Manager('mongodb://admin:0rb!t@localhost:27017');
$bulk = new MongoDB\Driver\BulkWrite(); //默认是有序的,串行执行
$bulk->delete(['user_id' => 5]); //删除user_id为5的字段
$manager->executeBulkWrite('admin.box', $bulk);

事务处理

<?php
use MongoDB\Driver\Exception\BulkWriteException;

$manager = new \MongoDB\Driver\Manager($server);
//开启session
//causalConsistency  boolean  因果一致性 如果操作依赖先前的操作需要设置为true
$session = $manager->startSession(['causalConsistency' => true]);
try {
    //开启事务
    $session->startTransaction();
    //todo insert update delete
    //提交事务
    $session->commitTransaction();
} catch (MongoDB\Driver\Exception\BulkWriteException $e) {
    //事务回滚
    $session->abortTransaction();
}

封装类

<?php
/**
 * mongodb 常用类
 */

namespace App\Utility;

use MongoDB\Driver\BulkWrite;
use MongoDB\Driver\Manager;
use MongoDB\Driver\Query;
use MongoDB\Driver\WriteConcern;
use Psr\Log\LoggerInterface;

/**
 * Class Mongo
 */
class MongoDb
{
    /** @var LoggerInterface 日志 */
    private $logger;

    private $dsn;

    private $database;

    private static $conn = [];  //保存连接

    /**
     * MongoDBCommon constructor.
     *
     * @param LoggerInterface $logger
     * @param string          $dsn //env中配置的参数
     * @param string          $database
     *
     */
    public function __construct(LoggerInterface $logger, string $dsn = "", string $database = "")
    {
        $this->dsn = empty($dsn) ? "MONGODB_URI" : $dsn;
        $this->database = empty($database) ? getenv("MONGODB_DATABASE") : $database;
        $this->logger = $logger;
    }

    /**
     * @param array  $documents
     * @param string $collectionName
     *
     * @return mixed 返回成功插入的条数
     */
    public function insert($documents, $collectionName)
    {
        $manager = $this->connect();
        try {
            $bulk = new BulkWrite();
            foreach ($documents as $document) {
                $bulk->insert($document);
            }
            $writeConcern = new WriteConcern(WriteConcern::MAJORITY, 1000);
            $result = $manager->executeBulkWrite($this->database.".".$collectionName, $bulk, $writeConcern);

            return $result->getInsertedCount();
        } catch (\Exception $exception) {
            $this->logger->error(sprintf('Mongo数据库【%s】多条数据插入失败,数据%s,原因%s', $collectionName, json_encode($documents), $exception->getMessage()));

            return false;
        }
    }

    /**
     * 根据id组删除所有.
     *
     * @param array  $ids
     * @param string $collectionName
     *
     * @return int
     */
    public function delete($ids, $collectionName)
    {
        $manager = $this->connect();
        try {
            $bulk = new BulkWrite();
            foreach ($ids as $id) {
                $bulk->delete(['_id' => (int)$id]);
            }
            $writeConcern = new WriteConcern(WriteConcern::MAJORITY, 1000);
            $result = $manager->executeBulkWrite($this->database.'.'.$collectionName, $bulk, $writeConcern);

            return $result->getDeletedCount();
        } catch (\Exception $exception) {
            $this->logger->error(sprintf('Mongo数据库删除【%s:%s】数据失败,原因%s', $collectionName, json_encode($ids), $exception->getMessage()));

            return false;
        }
    }

    /**
     * 更新操作
     *
     * @param array|int $filter
     * @param array     $update
     * @param string    $collectionName
     * @param string    $method set/inc两种方式更新
     * @param bool      $upsert
     *
     * @return mixed 返回修改个数
     */
    public function update($filter, array $update, string $collectionName, $method = "set", $upsert = false)
    {
        $manager = $this->connect();
        try {
            $bulk = new BulkWrite();
            if (is_int($filter)) {
                $id = $filter;
                $filter = ['_id' => $filter];
            }
            $bulk->update($filter, ['$'.$method => $update], ['upsert' => $upsert]);
            $writeConcern = new WriteConcern(WriteConcern::MAJORITY, 1000);
            $result = $manager->executeBulkWrite($this->database.'.'.$collectionName, $bulk, $writeConcern);

            return max($result->getModifiedCount(), $result->getUpsertedCount());
        } catch (\Exception $exception) {
            $this->logger->error(sprintf('Mongo数据库更新【%s:%s】数据失败,更新数据%s,原因%s', $collectionName, $id, json_encode($update), $exception->getMessage()));

            return false;
        }
    }

    /**
     * 查询接口
     *
     * @param array  $filter
     * @param string $collectionName
     * @param array  $options
     *
     * @return mixed
     *
     * @throws
     */
    public function fetch(array $filter, string $collectionName, $options = [])
    {
        $manager = $this->connect();
        try {
            $query = new Query($filter, $options);
            $res = $manager->executeQuery($this->database.'.'.$collectionName, $query);
            $items = [];
            if (!empty($res)) {
                foreach ($res as $v) {
                    $item = json_decode(json_encode($v), true);
                    if (is_numeric($item['_id']) || is_string($item['_id'])) {
                        $item['id'] = (string)$item['_id'];
                    }
                    $items[] = $item;
                }
            }
            unset($res, $v, $item);

            return $items;
        } catch (\Exception $exception) {
            $this->logger->error(sprintf('Mongo数据库数据获取【%s:%s】条件数据失败,原因%s', $collectionName, json_encode($filter), $exception->getMessage()));

            return false;
        }
    }

    /**
     * 链接函数
     * 配置一个static类获取mongodb连接
     */
    private function connect()
    {
        try {
            if (isset(self::$conn[$this->dsn]) && !empty(self::$conn[$this->dsn])) {
                return self::$conn[$this->dsn];
            }
            $manager = new Manager(getenv($this->dsn));
            self::$conn[$this->dsn] = $manager;

            return $manager;
        } catch (\Exception $e) {
            //连接异常
            $this->logger->error(sprintf('连接到【Mongo:%s】失败,失败原因%s', $this->dsn, $e->getMessage()));
        }

        return null;
    }
}

mongo模糊查询某些带特殊符号的字符串,发现查不到结果。于是,一顿找资料,发现:必须将带转义特殊字符的字符串进行转义处理,才能匹配到结果。封装了一个PHP版本的mongo模糊查询转义特殊字符的方法,如下所示:

/**
 * 转义正则特殊字符 ($()*+.[]?\^{},|)
 *
 * @param originStr
 * @return
 */
public static function escapeExprSpecialWord($originStr) {
    $retStr = $originStr;
    $fbsArr = ["\\", "$", "(", ")", "*", "+", ".", "[", "]", "?", "^", "{", "}", "|" ];
    foreach ($fbsArr  as $value) {
        $retStr = str_replace($value, "\\" . $value, $retStr);
    }
    return $retStr;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值