原文链接: http://www.zhaokeli.com/article/8574.html

MongoDb原生操作

Mongodb连接

PHP7 连接 MongoDB 语法如下:

复制代码

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");

插入数据

将 name 为"自学教程" 的数据插入到 test 数据库的 runoob 集合中。

复制代码

$bulk = new MongoDB\Driver\BulkWrite;
$document = ['_id' => new MongoDB\BSON\ObjectID, 'name' => '菜鸟教程'];
 
$_id= $bulk->insert($document);
 
var_dump($_id);
 
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");  
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
$result = $manager->executeBulkWrite('test.runoob', $bulk, $writeConcern);

读取数据

复制代码

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");  
 
// 插入数据
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['x' => 1, 'name'=>'baidu', 'url' => 'http://www.baidu.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) {
    print_r($document);
}

更新数据

复制代码

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->update(
    ['x' => 2],
    ['$set' => ['name' => '菜鸟工具', 'url' => 'tool.runoob.com']],
    ['multi' => false, 'upsert' => false]
);
 
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");  
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
$result = $manager->executeBulkWrite('test.sites', $bulk, $writeConcern);

删除数据

复制代码

$bulk = new MongoDB\Driver\BulkWrite;
$bulk->delete(['x' => 1], ['limit' => 1]);   // limit 为 1 时,删除第一条匹配数据
$bulk->delete(['x' => 2], ['limit' => 0]);   // limit 为 0 时,删除所有匹配数据
 
$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");  
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
$result = $manager->executeBulkWrite('test.sites', $bulk, $writeConcern);

MongoDB官方操作库

看完上面的CURD操作是不是感觉有点懵逼,操作方式跟想像中的完全不一样,可能官方也想到啦这一块,于是又封装啦一个操作库让大家使用。文档地址如下

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

安装

复制代码

composer require mongodb/mongodb

添加数据

插入单条数据

在数据库test中的users集合中插入数据,如果数据库或集合不存在则会自动创建

复制代码

$collection      = (new MongoDB\Client)->test->users;
$insertOneResult = $collection->insertOne([
    'username' => 'admin',
    'email'    => 'admin@example.com',
    'name'     => 'Admin User',
]);
printf("Inserted %d document(s)\n", $insertOneResult->getInsertedCount());
var_dump($insertOneResult->getInsertedId());

输出结果

数据库中数据

可以看出返回$oid为数据库自动分配的唯一标识,如果我们插入的时候传入id值的话,mongodb会判断这个id是否存在,如果存在就会报错,如果不存在则直接返回传入的id值

复制代码

$collection      = (new MongoDB\Client)->test->users;
$insertOneResult = $collection->insertOne(['_id' => 1, 'name' => 'Alice']);
printf("Inserted %d document(s)\n", $insertOneResult->getInsertedCount());
var_dump($insertOneResult->getInsertedId());

执行结果

插入多条数据

复制代码

$collection = (new MongoDB\Client)->test->users;
$insertManyResult = $collection->insertMany([
    [
        'username' => 'admin',
        'email' => 'admin@example.com',
        'name' => 'Admin User',
    ],
    [
        'username' => 'test',
        'email' => 'test@example.com',
        'name' => 'Test User',
    ],]);
printf("Inserted %d document(s)\n", $insertManyResult->getInsertedCount());
var_dump($insertManyResult->getInsertedIds());

查询数据

如果要使用id查询,则需要使用下面的ObjectId类来封装下传进去

使用自增id查询

复制代码

$collection = (new MongoDB\Client)->test->users;
$id         = new \MongoDB\BSON\ObjectId('5cecd708ab4e4536fc0076e2');
$document   = $collection->findOne(['_id' => $id]);
var_dump($document);

其它条件查询

使用其它条件数据则直接传进去就可以

复制代码

$collection = (new MongoDB\Client)->test->users;
$document   = $collection->findOne(['username' => 'admin']);
var_dump($document);

使用limit,sort,skip查询

默认情况下是返回所有的字段数据,也可以指定字段返回,limit是返回的行数,sort是使用name字段-1为降序,1为升序,skip为跳过前多少条数据如下

复制代码

$collection = (new MongoDB\Client)->test->users;
$cursor     = $collection->find(
    [
        'username' => 'admin',
    ],
    [
        'projection' => [
            'email' => 1,
        ],
        'limit'      => 4,
        'sort'       => ['name' => -1],
        'skip'       =>1,
    ]);
foreach ($cursor as $restaurant) {
    var_dump($restaurant);
}

正则条件查询

复制代码

$collection = (new MongoDB\Client)->test->users;
$cursor     = $collection->find(
    [
        'username' => new MongoDB\BSON\Regex('^ad', 'i'),
    ],
    [
        'projection' => [
            'email' => 1,
        ],
        'limit'      => 1,
        'sort'       => ['pop' => -1],
    ]);
foreach ($cursor as $restaurant) {
    var_dump($restaurant);
}

另外一种正则式的写法

复制代码

$collection = (new MongoDB\Client)->test->users;
$cursor     = $collection->find(
    [
        'username' => ['$regex' => '^ad', '$options' => 'i'],
    ],
    [
        'projection' => [
            'email' => 1,
        ],
        'limit'      => 1,
        'sort'       => ['pop' => -1],
    ]);
foreach ($cursor as $restaurant) {
    var_dump($restaurant);
}

查询多个数据

复制代码

$collection = (new MongoDB\Client)->test->users;
$cursor     = $collection->find(['username' => 'admin']);
foreach ($cursor as $document) {
    echo $document['_id'], "\n";
}

更新数据

更新单条数据

复制代码

$collection   = (new MongoDB\Client)->test->users;
$updateResult = $collection->updateOne(
    ['username' => 'admin'],
    ['$set' => ['name' => 'new nickname']]
);
printf("Matched %d document(s)\n", $updateResult->getMatchedCount());
printf("Modified %d document(s)\n", $updateResult->getModifiedCount());

更新多条数据

复制代码

$collection   = (new MongoDB\Client)->test->users;
$updateResult = $collection->updateMany(
    ['username' => 'admin'],
    ['$set' => ['name' => 'new nickname']]
);
printf("Matched %d document(s)\n", $updateResult->getMatchedCount());
printf("Modified %d document(s)\n", $updateResult->getModifiedCount());

替换文档

替换文档其它跟更新数据类似,但是这个操作不会修改id,如下

复制代码

$collection   = (new MongoDB\Client)->test->users;
$updateResult = $collection->replaceOne(
    ['username' => 'admin'],
    ['username' => 'admin2', 'name' => 'new nickname']
);
printf("Matched %d document(s)\n", $updateResult->getMatchedCount());
printf("Modified %d document(s)\n", $updateResult->getModifiedCount());

Upsert操作

这个名字应该是个缩写,更新或替换操作时如果有匹配的数据则直接操作,如果没有匹配的数据则插入一条新数据,意思是如果更新或替换操作的第三个参数如果传 'upsert'=>True 的话就可以开启这个功能

复制代码

$collection   = (new MongoDB\Client)->test->users;
$updateResult = $collection->updateOne(
    ['username' => 'admin3'],
    ['$set' => ['username' => 'admin2', 'name' => 'new nickname']],
    ['upsert' => true]
);
printf("Matched %d document(s)\n", $updateResult->getMatchedCount());
printf("Modified %d document(s)\n", $updateResult->getModifiedCount());
printf("Upserted %d document(s)\n", $updateResult->getUpsertedCount());
$upsertedDocument = $collection->findOne([
    '_id' => $updateResult->getUpsertedId(),
]);
var_dump($upsertedDocument);

如果有匹配的情况下最后输出为NULl

没有匹配的情况下最后输出插入的数据

删除数据

复制代码

$collection   = (new MongoDB\Client)->test->users;
$deleteResult = $collection->deleteOne(['username' => 'admin3']);
printf("Deleted %d document(s)\n", $deleteResult->getDeletedCount());
$deleteResult = $collection->deleteMany(['username' => 'admin2']);
printf("Deleted %d document(s)\n", $deleteResult->getDeletedCount());

PHP7 MongoDB 使用方法的更多相关文章

  1. MongoDB基本方法

    一.MongoDB Limit与Skip方法 MongoDB Limit() 方法 如果你需要在MongoDB中读取指定数量的数据记录,可以使用MongoDB的Limit方法,limit()方法接受一 ...

  2. 落网数据库简单查询接口 caddy+php7+mongodb

    落网数据库简单查询接口 一个简单的DEMO,使用了caddy + php7 + mongodb 数据库&接口设计 来自 https://github.com/Aedron/Luoo.spide ...

  3. windows2012 下面php7.2 安装mongodb4.0.4的扩展以及操作mongodb的方法

    php连接mongodb驱动 的下载页面http://pecl.php.net/package/mongodb 数据插入: $manager = new MongoDB\Driver\Manager( ...

  4. ubuntu中搭建php7+mongodb方法

    首先照着这篇文章操作 http://blog.csdn.net/Toshiya14/article/details/51417076 结果发现一直报Cannot find OpenSSL's libr ...

  5. 推荐一个php7+ mongodb三方类

      373 次阅读  ·  读完需要 8 分钟 5 由于项目需要,把项目升级到了php7.但是升级了之后发现mongo扩展不能用了.php7.0以上只支持mongodb扩展了.而mongodb扩展的驱 ...

  6. nodejs连接mongodb的方法

    一. var express = require('express'); var mongodb = require('mongodb'); var app = express(); app.use( ...

  7. C# 访问MongoDB 通用方法类

    using MongoDB.Driver; using System; namespace MongoDBDemo { public class MongoDb { public MongoDb(st ...

  8. MongoDB 备份方法

    翻译自 http://docs.mongodb.org/manual/core/backups/ 有以下几种方法来备份MongoDB群集: 通过复制底层数据文件来备份 通过mongodump来备份 通 ...

  9. springdata整合mongodb一些方法包括or,and,regex等等《有待更新》

    这几天接触mongodb以及springdata,自己英语比较戳,所以整理这些方法花的时间多了点,不过也是我第一次在外国网站整理技术 不多说,直接上代码,这里只是给出一些操作方法而已,如果有需要源码的 ...

随机推荐

  1. XML知识学习

    第一部分[基础篇]: https://www.w3school.com.cn/xml/xml_intro.asp W3C教程地址 什么是 XML? XML 指可扩展标记语言(EXtensible Ma ...

  2. LOJ#3104「TJOI2019」甲苯先生的字符串

    题目描述 一天小甲苯得到了一条神的指示,他要把神的指示写下来,但是又不能泄露天机,所以他要用一种方法把神的指示记下来. 神的指示是一个字符串,记为字符串 \(s_1\),\(s_1\) 仅包含小写字母 ...

  3. redis cluster集群的原理

    redis集群的概述: 在以前,如果前几年的时候,一般来说,redis如果要搞几个节点,每个节点存储一部分的数据,得借助一些中间件来实现,比如说有codis,或者twemproxy,都有.有一些red ...

  4. [Apio2010]patrol 巡逻

    1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2541  Solved: 1288[Submit][S ...

  5. IOT设备通讯,MQTT物联网协议,MQTTnet

    一.IOT设备的特性 硬件能力差(存储能力基本只有几MB,CPU频率低连使用HTTP请求都很奢侈) 系统千差万别(Brillo,mbedOS,RIOT等) 如使用电池供电,电量消耗敏感 如果是小设备, ...

  6. 导出到CSV文件

    一.手工导出导出 1.winform void DataGridViewToExcel(DataGridView dataGridView1) { SaveFileDialog saveFileDia ...

  7. 适合于做项目与团队管理的工具(Choerodon)

    官网链接:http://choerodon.io/zh/ 此处不做太多的介绍,需要了解的朋友进入官网进行查看. Choerodon猪齿鱼开源多云技术平台,是基于开源技术Kubernetes,Istio ...

  8. 一.什么是protobuf

    Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 ...

  9. Python函数的基本使用

    在编程中,无论使用什么 编程语言,函数的使用都是非常广泛的,函数能够完成特定的功能,降低编程的难度和代码重用. 1.函数的定义: 函数是一段具有特定功能的.可重用的语句组,用函数名来表示并通过函数名进 ...

  10. cocoapods安装错误的原因

    gem 可以理解为管理RUBY库和程序包的查找,安装,升级和卸载是个非常好用的工具. gem install cocoapods过程中出现错误的问题.1.gem的源设置错误应该参照,下面来执行gem ...