golang mongodb 复杂插入更新如何实现_[精选] 不学一下MongoDB感觉有些对不起自己哇...

本文介绍了MongoDB的特点、使用原理、适用场景和不适场景,并提供了Golang操作MongoDB的示例,包括数据库连接、数据插入、查询、更新和删除等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

391e40d043434b1b320ef4579c60a740.gif

文章来自:https://www.jb51.net/article/158376.htm

作者:脚本之家

点击加入:PHP自学中心技术交流微信群

商务合作请加微信(QQ):2230304070

精选文章正文

视频教程推荐:【全面掌握MongoDB4.0 从入门到实践 】 链接地址: http://www.mano100.cn/thread-1716-1-1.html

我先列一下你要学的哪些技术栈,一般你都会的,或者小型企业用过的,基本都是要会php, nginx, linux ,mysql ,redis(memcached) ,这几个你都掌握吧!没掌握的就不算是php程序员了。

然而你要提升自己的技术技能,那你就必须学习更多的语言来扩展自己。不管以后有没有用到,你必须要学。都要学。

提升技能你就应该学习别人没怎么用过的,比如:MongoDB,Docker,RabbitMQ(ActiveMQ,RokcetMQ,Kafka),Zookeeper,Swoole(Golang),这些可以理解为高级一点的php配套语言吧,因为稍微大一点的项目,你就会用到这些技术了。

下面就来给大家详解一下php如何用MongoDB的。先来看看什么是MongoDB,如何应用。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。

Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

特点

它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:  

*面向集合存储,易存储对象类型的数据。

*模式自由。

*支持动态查询。

*支持完全索引,包含内部对象。

*支持查询。

*支持复制和故障恢复。

*使用高效的二进制数据存储,包括大型对象(如视频等)。

*自动处理碎片,以支持云计算层次的扩展性。

*支持RUBY,PYTHON,JAVA,C ,PHP,C#等多种语言。

*文件存储格式为BSON(一种JSON的扩展)。

*可通过网络访问。

使用原理

所谓“面向集合”(Collection-Oriented),意思是数据被分组存储在数据集中,被称为一个集合(Collection)。每个集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。

集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定义任何模式(schema)。Nytro MegaRAID技术中的闪存高速缓存算法,能够快速识别数据库内大数据集中的热数据,提供一致的性能改进。

模式自由(schema-free),意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。

存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各种复杂的文件类型。我们称这种存储形式为BSON(Binary Serialized Document Format)。

适用场景

MongoDB 的主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS 系统(具有丰富的功能)之间架起一座桥梁,它集两者的优势于一身。根据官方网站的描述,Mongo 适用于以下场景。

● 网站数据:Mongo 非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。

● 缓存:由于性能很高,Mongo 也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo 搭建的持久化缓存层可以避免下层的数据源过载。

● 大尺寸、低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。

● 高伸缩性的场景:Mongo 非常适合由数十或数百台服务器组成的数据库,Mongo 的路线图中已经包含对MapReduce 引擎的内置支持。

● 用于对象及JSON 数据的存储:Mongo 的BSON 数据格式非常适合文档化格式的存储及查询。

不适场景

● 高度事务性的系统:例如,银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。

● 传统的商业智能应用:针对特定问题的BI 数据库会产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。

● 需要SQL 的问题。

Mognodb数据库连接.

默认格式

$m = new Mongo();

//这里采用默认连接本机的27017端口,当然也可以连接远程主机
如 192.168.0.4:27017,如果端口是27017,端口可以省略。

标准连接

$m = new Mongo("mongodb://${username}:${password}@localhost");

实例

$m = new Mongo("mongodb://127.0.0.1:27017/admin:admin");

数据库的用户名和密码都是admin

数据库操作

插入数据

<?php //这里采用默认连接本机的27017端口,当然你也可以连接远程主机如192.168.0.4:27017//如果端口是27017,端口可以省略
$m = new Mongo("mongodb://127.0.0.1:27017/admin:admin");//选择comedy数据库,如果以前没该数据库会自动创建,也可以用$m->selectDB("comedy");
$db = $m->comedy;//选择comedy里面的collection集合,相当于RDBMS里面的表,也可以使用
$collection = $db->collection;
$db->selectCollection("collection");/*********添加一个元素**************/
$obj = array("title" => "php1", "author" => "Bill Watterson");//将$obj 添加到$collection 集合中
$collection->insert($obj);/*********添加另一个元素**************/
$obj = array("title" => "huaibei", "online" => true);
$collection->insert($obj);//$query = array("title" => "huaibei");
$query = array( "_id" => $obj['_id'] );
$cursor = $collection->find($query);//遍历所有集合中的文档foreach ($cursor as $obj) {echo $obj["title"] . "\n";echo $obj["_id"] . "\n";
}//断开MongoDB连接
$m->close();

带条件的查询

mysql: id = 123

mongo: array(‘id'=>123)
mysql: name link '%bar%'
mongo: array(‘name' => new MongoRegex(‘/.*bar.*/i'))
mysql: where id > 10
mongo: array(‘id' => array(‘$gt' => 10))
mysql: where id >= 10
mongo: array(‘id' => array(‘$gte' => 10))
mysql: where id 
mongo: array(‘id' => array(‘$lt' => 10))
mysql: where id <= 10
mongo: array(‘id' => array(‘$lte' => 10))
mysql: where id > 1 and id 
mongo: array(‘id' => array(‘$gt' => 1,'$lt' => 10))
mysql: where id <> 10
mongo: array(‘id' => array(‘$ne' => 10))
mysql: where id in(123)
mongo: array(‘id' => array(‘$in' => array(1,2,3)))
mysql: where id not in(123)
mongo: array(‘id' => array(‘$nin' => array(1,2,3)))
mysql: where id = 2 or id = 9
mongo: array(‘id' => array(‘$or' => array(array(‘id'=>2),array(‘id'=>9))))
mysql: order by name asc
mongo: array(‘sort'=>array(‘name'=>1))
mysql: order by name desc
mongo: array(‘sort'=>array(‘name'=>-1))
mysql: limit 0,2
mongo: array(‘limit'=>array(‘offset'=>0,'rows'=>2))
mysql: select name,email
mongo: array(‘name','email')

mysql: select count(name)

mongo: array(‘COUNT') //注意:COUNT为大写

查询时,每个Object插入时都会自动生成一个独特的_id,它相当于RDBMS中的主键,用于查询时非常方便 (_id每一都不同,很像自动增加的id)

<?php 
$param = array("name" => "joe");
$collection->insert($param);
$joe = $collection->findOne(array("_id" => $param['_id']));
print_R($joe);
$m->close();

返回结果:Array ( [_id] => MongoId Object ( [$id] => 4fd30e21870da83416000002 ) [name] => joe )

更改字段值

<?php 
$sign = array("title" => 'php1');
$param = array("title" => 'php1','author'=>'test');
$joe = $collection->update($sign, $param);

删除一个数据库

$m -> dropDB(“comedy”);

列出所有可用数据库

$m->listDBs();  //无返回值

创建一个MongoDB对象

<?php 
$mo = new Mongo();
$db = new MongoDB($mo,'dbname');//通过创建方式获得一个MongoDB对象

删除当前DB

<?php 
$db = $mo->dbname;
$db->drop();

获得当前数据库名

<?php 
$db = $mo->dbname;
$db->_tostring();

选择想要的collection:

//A:

$mo = new Mongo();

$coll = $mo->dbname->collname;//获得一个collection对象

//B:

$db = $mo->selectDB('dbname');

$coll = $db->collname;

//C:

$db = $mo->dbname;

$coll = $db->collname;

//D:

$db = $mo->dbname;

$coll = $db->selectCollectoin('collname');//获得一个collection对象

插入数据(MongoCollection对象

$coll = $mo->db->foo;

$a = array('a'=>'b');

$options = array('safe'=>true);

$rs =$coll->insert($a,$options);

删除数据库中的记录(MongoCollection对象)

$coll = $mo->db->coll;
$c = array('a'=>1,'s'=>array('$lt'=>100));
$options = array('safe'=>true);
$rs = $coll->remove($c,$options);

更新数据库中的记录(MongoCollection对象)

$coll = $mo->db->coll;
$c = array('a'=>1,'s'=>array('$lt'=>100));
$newobj = array('e'=>'f','x'=>'y');
$options = array('safe'=>true,'multiple'=>true);
$rs = $coll->remove($c,$newobj,$options);

查询collection获得单条记录(MongoCollection类)

$coll = $mo->db->coll;
$query = array('s'=>array('$lt'=>100));
$fields = array('a'=>true,'b'=>true);
$rs = $coll->findOne($query,$fields);

查询collection获得多条记录(MongoCollection类)

$coll = $mo->db->coll;
$query = array('s'=>array('$lt'=>100));
$fields = array('a'=>true,'b'=>true);
$cursor = $coll->find($query,$fields);

//排序
$cursor->sort(array(‘字段'=>-1));(-1倒序,1正序)
//跳过部分记录
$cursor->skip(100);跳过100行
//只显示部分记录
$cursor->limit(100);只显示100行
返回一个游标记录对象MongoCursor。

针对游标对象MongoCursor的操作(MongoCursor类)

$cursor = $coll->find($query,$fields);

while($cursor->hasNext()){

$r = $cursor->getNext();

var_dump($r);

}

//或者

$cursor = $coll->find($query,$fields);

foreache($cursor as $k=>$v){

var_dump($v);

}

//或者

$cursor = $coll->find($query,$fields);

$array= iterator_to_array($cursor);

以上是本文的全部内容,希望对大家的学习有帮助,也希望大家多多支持 php自学中心 ,学习与交流少不了一个圈子,点击加技术群:PHP自学中心交流②群

91f23cbd1c87efab5eceab4e60af96d2.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值