php操作MongoDB

<?php

namespace app\admin\controller;


use MongoDB\Driver\Command;
use MongoDB\Driver\Manager;
use MongoDB\Driver\BulkWrite;
use MongoDB\Driver\Query;
use think\console\command\make\Controller;
use think\Db;

//MongoDB测试
class Mongo extends Controller
{
    public function test()
    {
        //$m = new \MongoDb\Driver\Manager(); // 连接默认主机和端口为:mongodb://localhost:27017


        // 查询操作
//        $user = Db::connect('MongoDB')->table('demo')->find();
//        $user = Db::connect('MongoDB')->table('col')->select();
//        $user = Db::connect('MongoDB')->where('_id',"5c370236700e92e17de0d705")->table('demo')->find();
//        $user = Db::connect('MongoDB')->table('demo')->find()["_id"];
    }

    //PHP代码操作MongoDB数据库
    public function mongoTest()
    {
        $manager = new \MongoDB\Driver\Manager("mongodb://localhost:27017");

        // 插入数据
        $bulk = new \MongoDB\Driver\BulkWrite;
        $bulk->insert(['x' => 1, 'name' => 'php', 'url' => 'http://www.runoob.com']);
        $bulk->insert(['x' => 2, 'name' => 'Google', 'url' => 'http://www.google.com']);
        $bulk->insert(['x' => 3, 'name' => 'taobao', 'url' => 'http://www.taobao.com']);
        $manager->executeBulkWrite('test.sites', $bulk);

        $filter = ['x' => ['$gt' => 1]];
        $options = [
            'projection' => ['_id' => 0],
            'sort' => ['x' => -1],
        ];

        // 查询数据
        $query = new \MongoDB\Driver\Query($filter, $options);
        $cursor = $manager->executeQuery('test.sites', $query);

        foreach ($cursor as $document) {
            echo '<pre>';
            print_r($document);
            echo '</pre>';
        }
    }

    public function mongotest2()
    {
        $manager = new Manager();
        $bulk = new BulkWrite();


        //http://www.mongoing.com/docs/tutorial/query-documents.html#query-method
        //数据库中测试的数据(数据表名称:库:LS,集合(表):hh、user)
        /**
         * {
         * "_id" : 1,
         * "name" : "sue",
         * "age" : 19,
         * "type" : 1,
         * "status" : "P",
         * "favorites" : {
         * "artist" : "Picasso",
         * "food" : "pizza"
         * },
         * "finished" : [
         * 17,
         * 3
         * ],
         * "badges" : [
         * "blue",
         * "black"
         * ],
         * "points" : [
         * {
         * "points" : 85,
         * "bonus" : 20
         * },
         * {
         * "points" : 85,
         * "bonus" : 10
         * }
         * ]
         * }
         * {
         * "_id" : 2,
         * "name" : "bob",
         * "age" : 42,
         * "type" : 1,
         * "status" : "A",
         * "favorites" : {
         * "artist" : "Miro",
         * "food" : "meringue"
         * },
         * "finished" : [
         * 11,
         * 25
         * ],
         * "badges" : [
         * "green"
         * ],
         * "points" : [
         * {
         * "points" : 85,
         * "bonus" : 20
         * },
         * {
         * "points" : 64,
         * "bonus" : 12
         * }
         * ]
         * }
         * {
         * "_id" : 3,
         * "name" : "ahn",
         * "age" : 22,
         * "type" : 2,
         * "status" : "A",
         * "favorites" : {
         * "artist" : "Cassatt",
         * "food" : "cake"
         * },
         * "finished" : [
         * 6
         * ],
         * "badges" : [
         * "blue",
         * "red"
         * ],
         * "points" : [
         * {
         * "points" : 81,
         * "bonus" : 8
         * },
         * {
         * "points" : 55,
         * "bonus" : 20
         * }
         * ]
         * }
         * {
         * "_id" : 4,
         * "name" : "xi",
         * "age" : 34,
         * "type" : 2,
         * "status" : "D",
         * "favorites" : {
         * "artist" : "Chagall",
         * "food" : "chocolate"
         * },
         * "finished" : [
         * 5,
         * 11
         * ],
         * "badges" : [
         * "red",
         * "black"
         * ],
         * "points" : [
         * {
         * "points" : 53,
         * "bonus" : 15
         * },
         * {
         * "points" : 51,
         * "bonus" : 15
         * }
         * ]
         * }
         * {
         * "_id" : 5,
         * "name" : "xyz",
         * "age" : 23,
         * "type" : 2,
         * "status" : "D",
         * "favorites" : {
         * "artist" : "Noguchi",
         * "food" : "nougat"
         * },
         * "finished" : [
         * 14,
         * 6
         * ],
         * "badges" : [
         * "orange"
         * ],
         * "points" : [
         * {
         * "points" : 71,
         * "bonus" : 20
         * }
         * ]
         * }
         * {
         * "_id" : 6,
         * "name" : "abc",
         * "age" : 43,
         * "type" : 1,
         * "status" : "A",
         * "favorites" : {
         * "food" : "pizza",
         * "artist" : "Picasso"
         * },
         * "finished" : [
         * 18,
         * 12
         * ],
         * "badges" : [
         * "black",
         * "blue"
         * ],
         * "points" : [
         * {
         * "points" : 78,
         * "bonus" : 8
         * },
         * {
         * "points" : 57,
         * "bonus" : 7
         * }
         * ]
         * }
         */


        //单条插入操作
//        $bulk->insert(['name' => '宋江', 'sex' => '男', 'address' => '山东郓城', 'nickname' => '及时雨、黑三郎', 'order' => '梁山排名第1']);
//        $res = $manager->executeBulkWrite('LS.hh', $bulk);


        //批量插入(错误1)
//        $bulk->insert([
//            ['name' => '吴用', 'sex' => '男', 'address' => '山东', 'nickname' => '智多星', 'order' => '梁山排名第2'],
//            ['name' => '武松', 'sex' => '男', 'address' => '河北', 'nickname' => '行者', 'order' => '梁山排名第10'],
//            ['name' => '林冲', 'sex' => '男', 'address' => '河南', 'nickname' => '豹子头', 'order' => '梁山排名第8']
//        ]);
//        $res = $manager->executeBulkWrite('LS.hh',$bulk);


        //批量插入(错误2)
//        $bulk->insert([
//            "{'name' => '李逵', 'sex' => '男', 'address' => '山西', 'nickname' => '黑旋风', 'order' => '梁山排名第9'}",
//            "{'name' => '秦明', 'sex' => '男', 'address' => '河北', 'nickname' => '霹雳火', 'order' => '梁山排名第19'}",
//            "{'name' => '卢俊义', 'sex' => '男', 'address' => '河南', 'nickname' => '玉麒麟', 'order' => '梁山排名第4']}"
//        ]);
//        $res = $manager->executeBulkWrite('LS.hh', $bulk);


        //批量写入(使用框架框架封装的方法,正确的)
//        $dataAll = [
//            ['name' => '吴用1', 'sex' => '男', 'address' => '山东', 'nickname' => '智多星', 'order' => '梁山排名第2'],
//            ['name' => '武松1', 'sex' => '男', 'address' => '河北', 'nickname' => '行者', 'order' => '梁山排名第10'],
//            ['name' => '林冲1', 'sex' => '男', 'address' => '河南', 'nickname' => '豹子头', 'order' => '梁山排名第8']
//        ];
//        $res = Db::connect("MongoDB")->table('hh')->insertAll($dataAll);


        //条件查询1(等于:“=”)
//        $filter = ['status' => "A"];
        $options = [
            'projection' => ['_id' => 0],
        ];
//        $options = [
//            'projection'=>['age'=>0,'_id'=>0]
//        ];
//        $query = new Query($filter, $options);
//        $rows = $manager->executeQuery('LS.users', $query);
//        foreach ($rows as $r) {
//            echo '<pre>';
//            print_r($r);
//            echo '</pre>';
//        }
//        die;


        //条件查询2(大于:“>”)
//        $filter = ['age' => ['$gt' => 40]];
//        $query = new Query($filter);
//        $rows = $manager->executeQuery('LS.users', $query);
//        foreach ($rows as $r) {
//            echo '<pre>';
//            print_r($r);
//            echo '</pre>';
//        }
//        die;


        //条件查询3(在...中:“in”或者“or”)
//        $filter = ['status' => ['$in' => ['A', 'D']]];
//        $query = new Query($filter);
//        $rows = $manager->executeQuery('LS.users', $query);
//        foreach ($rows as $r) {
//            echo '<pre>';
//            print_r($r);
//            echo '</pre>';
//        }
//        die;


        //条件查询( and条件)
//        $filter = [
//            'status' => ['$in' => ['A', 'D']],
//            'age' => ['$gt' => 40]
//        ];
//        $query = new Query($filter);
//        $rows = $manager->executeQuery('LS.users',$query);
//        foreach ($rows as $key=>$value){
//            echo '<pre>';
//            print_r($value);
//            echo '</pre>';
//        }
//        die;


        //条件查询(or条件查询,明确指明是or查询)
        //MongoDB查询语句:db.users.find({$or:[{"status":"A"},{"age":34}]})
//        $filter = [
//            '$or' => [
//                ['status' => 'D'],
//                ['age' => ['$gt' => 40]]
//            ]
//        ];
//        $query = new Query($filter);
//        $rows = $manager->executeQuery('LS.users', $query);
//        foreach ($rows as $key => $value) {
//            echo '<pre>';
//            print_r($value);
//            echo '</pre>';
//        }
//        die;


        //条件查询(同时使用and和or查询)
        //MongoDB查询语句:db.users.find({"status":"A",$or:[{age:{$lt:40}},{type:1}]})
//        $filter = [
//            'status' => 'A',
//            '$or' => [
//                ['age' => ['$gt' => 40]],
//                ['type' => 1]
//            ]
//        ];
//        $query = new Query($filter);
//        $rows = $manager->executeQuery('LS.users', $query);
//        foreach ($rows as $k => $v) {
//            echo '<pre>';
//            print_r($v);
//            echo '</pre>';
//        }
//        die;


        //条件查询(匹配记录(文档)型字段符合条件的查询)
        //MongoDB查询语句:db.users.find({"favorites":{"artist":"Cassatt","food":"cake"}}).pretty()
//        $filter = [
//            'favorites' => ['artist' => 'Cassatt', 'food' => 'cake'],
//        ];
//        $query = new Query($filter);
//        $rows = $manager->executeQuery("LS.users", $query);
//        foreach ($rows as $k => $v) {
//            echo '<pre>';
//            print_r($v);
//            echo '</pre>';
//        }
//        die;


        //条件查询(类似于JavaScript语法的查询)
        //MongoDB查询语句:db.users.find({'favorites.food':'cake'}).pretty()
//        $filter = [
//            'favorites.food' => 'cake'
//        ];
//        $query = new Query($filter);
//        $rows = $manager->executeQuery("LS.users", $query);
//        foreach ($rows as $k => $v) {
//            echo '<pre>';
//            print_r($v);
//            echo '</pre>';
//        }
//        die;


        //查询(在数组上的查询)
        //MongoDB查询语句:db.users.find({"badges":['blue','black']}).pretty()
//        $fillter = [
//            'badges' => ['blue', 'black']
//        ];
//        $query = new Query($fillter);
//        $rows = $manager->executeQuery('LS.users', $query);
//        foreach ($rows as $key => $value) {
//            echo '<pre>';
//            print_r($value);
//            echo '</pre>';
//        }
//        die;


        //查询(在数组上的查询,匹配数组上的某一个元素)
        //MongoDB查询语句:db.users.find({"badges":['blue','black']}).pretty()
//        $fillter = [
//            'badges' => 'black'
//        ];
//        $query = new Query($fillter);
//        $rows = $manager->executeQuery('LS.users', $query);
//        foreach ($rows as $key => $value) {
//            echo '<pre>';
//            print_r($value);
//            echo '</pre>';
//        }
//        die;


        //查询(在数组上的查询,匹配数组上的某一个元素)
        //MongoDB查询语句:db.users.find({"badges.0":'black'}).pretty()
//        $fillter = [
//            'badges.0' => 'black'//匹配badges字段(该字段是数组)的第一个元素时‘block’的记录
//        ];
//        $query = new Query($fillter);
//        $rows = $manager->executeQuery('LS.users', $query);
//        foreach ($rows as $key => $value) {
//            echo '<pre>';
//            print_r($value);
//            echo '</pre>';
//        }
//        die;


        //查询(使用 $elemMatch 操作符为数组元素指定复合条件)
        //MongoDB查询语句:db.users.find({finished:{$elemMatch:{$gt:15,$lt:20}}})
//        $fillter = [
//            'finished' => [
//                '$elemMatch' => [//查询的是同时满足两个条件:第一个数组元素大于15,第二个数组元素小于20
//                    '$gt' => 15,
//                    '$lt' => 20
//                ]
//            ]
//        ];
//        $query = new Query($fillter);
//        $rows = $manager->executeQuery('LS.users', $query);
//        foreach ($rows as $key => $value) {
//            echo '<pre>';
//            print_r($value);
//            echo '</pre>';
//        }
//        die;


        //查询(使用 $elemMatch 操作符为数组元素指定复合条件)
        //MongoDB查询语句:db.users.find({'finished':{$gt:15,$lt:20}})
//        $fillter = [
//            'finished' => [//查询的是只要有一个满足条件就可以:第一个数组元素大于15,或者第二个数组元素小于20
//                '$gt' => 15,
//                '$lt' => 20
//            ]
//        ];
//        $query = new Query($fillter);
//        $rows = $manager->executeQuery('LS.users', $query);
//        foreach ($rows as $key => $value) {
//            echo '<pre>';
//            print_r($value);
//            echo '</pre>';
//        }
//        die;


        //查询(使用 $elemMatch 操作符为数组元素指定复合条件)
        //MongoDB查询语句:db.users.find( { 'points.0.points': { $lte: 55 } } )
//        $fillter = [
//            'points.0.points' => ['$lte' => 53]
//        ];
//        $query = new Query($fillter);
//        $rows = $manager->executeQuery('LS.users', $query);
//        foreach ($rows as $key => $value) {
//            echo '<pre>';
//            print_r($value);
//            echo '</pre>';
//        }
//        die;


        //查询(使用 $elemMatch 操作符为数组元素指定复合条件,以查询数组中至少一个元素满足所有指定条件的文档。)
        //查询 points 数组有至少一个包含 points 小于等于 70 并且字段 bonus 等于 20 的内嵌文档的文档
        //MongoDB查询语句:db.users.find({points:{$elemMatch:{points:{$lte:70},bonus:20}}})
        $fillter = [
            'points' => [
                '$elemMatch' => [//同时满足:数组中的posints小于等于70,bonus等于20
                    'points' => ['$lte' => 70],
                    'bonus' => 20
                ]
            ]
        ];
        $query = new Query($fillter);
        $rows = $manager->executeQuery('LS.users', $query);
        foreach ($rows as $key => $value) {
            echo '<pre>';
            print_r($value);
            echo '</pre>';
        }
        die;

        //更新数据
//        $bulk->update(['x' => 2], ['$set' => ['x' => 1]], ['multi' => false, 'upsert' => false]);
        echo '<pre>';
//        print_r(Db::connect("MongoDB")->table('hh')->select());
        print_r($rows);
        echo '</pre>';
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值