<?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>';
}
}