tcb13 / sequel-mongo-php
Requires
- php: >=7.2
- ext-curl: *
- ext-json: *
- ext-mongodb: *
- mongodb/mongodb: *
README
一个轻量级、表达式丰富的、与框架无关的PHP查询构建器,可让您在MongoDB数据库上运行类似SQL的查询。享受两个世界的最佳之处!
安装
使用composer拉取包。
$ composer require TCB13/sequel-mongo-php
用法
使用MongoDB\Client
连接到您的数据库:
// Start a MongoDB Client to create a connection to your Database $mongoConnection = new \MongoDB\Client("mongodb://127.0.0.1", [ "username" => "user", "password" => "pass" ]); /** @var \MongoDB\Database $mongo */ $mongo = $mongoConnection->selectDatabase("DatabaseName");
从集合中获取一个项目:
$qb = new QueryBuilder($mongo); $qb->collection("Users") ->select("_id") ->find(); $result = $qb->toObject(); var_dump($result);
获取多个项目:
$qb = new QueryBuilder($mongo); $qb->collection("Users") ->select("_id") ->limit(2) ->findAll(); $result = $qb->toObject(); var_dump($result);
select()
接受所需字段作为字符串的array
或可变数量的参数。
使用多个where
条件、limit
和order
执行复杂查询。
// Use the Query Builder $qb = new QueryBuilder($mongo); $qb->collection("Users") ->select("_id", "name", "email", "active") ->where("setting", "!=", "other") ->where("active", false) ->where(function ($qb) { $qb->where("isValid", true) ->orWhere("dateActivated", "!=", null); }) ->limit(100) ->order("dateCreated", "ASC") ->findAll(); $result = $qb->toObject(); var_dump($result);
- 如果
where()
查询中省略了运算符,则将使用=
。例如:->where("active", false)
; - 您可以通过提供闭包来按组分组
where
条件。例如:WHERE id = 1 AND (isValid = true OR dateActivated != null)可以写成
->where("id", 1) ->where(function ($qb) { $qb->where("isValid", true) ->orWhere("dateActivated", "!=", null); })
where()
支持以下运算符:=
、!=
、>
、>=
、<
、<=
;- SQL的
WHERE IN()
也可用
$qb = new QueryBuilder($mongo); $qb->collection("Orders") ->whereIn("itemCount", [22,4]) ->findAll(); $result = $qb->toArray();
-
WHERE NOT IN()
可通过whereNotIn()
和orWhereNotIn()
分别使用; -
其他有用字符串查询的示例
->whereStartsWith("item", "start") ->whereEndsWith("item", "end") ->whereContains("item", "-middle-") ->whereRegex("item", ".*-middle-.*")
- 对于更复杂的字符串查询,您还可以使用正则表达式
->whereRegex("item", ".*-middle-.*")
计数文档
您可以使用count()
方法计数与查询匹配的文档/记录数
$qb = new QueryBuilder($mongo); $result = $qb->collection("Users") ->where("userid", $this->id) ->count(); var_dump($result);
注意,您可能无法将find()
或findAll()
与该方法一起使用。
插入文档:
$qb = new QueryBuilder($mongo); $result = $qb->collection("TestCollection") ->insert([ "item" => "test-insert", "xpto" => microtime(true) ]); var_dump($result);
- 您还可以一次性插入多个文档
$items = [ [ "item" => "test-insert-multi", "xpto" => microtime(true) ], [ "item" => "test-insert-multi", "xpto" => microtime(true) ] ]; $qb = new QueryBuilder($mongo); $result = $qb->collection("TestCollection") ->insert($items);
删除文档:
$qb = new QueryBuilder($mongo); $result = $qb->collection("TestCollection") ->whereStartsWith("item", "test-insert-") ->delete(); var_dump($result);
更新文档:
// Update item $qb = new QueryBuilder($mongo); $result = $qb->collection($collection) ->where("_id", new MongoID("51ee74e944670a09028d4fc9")) ->update([ "item" => "updated-value " . microtime(true) ]); var_dump($result);
- 您可以仅更新几个字段或整个文档——就像SQL中的
update
语句一样。
连接集合:
join($collectionToJoin, $localField, $operatorOrForeignField, $foreignField)
$qb = new QueryBuilder($mongo); $qb->collection("Orders") //->select("_id", "products#joined.sku") //->join(["products" => "products#joined"], "sku", "=", "item"]) //->join("products", "sku", "=", "item") ->join("Products", "sku", "item") ->findAll(); $result = $qb->toArray(); var_dump($result);
特殊函数:
Max(string $property, ?string $alias = null) - 获取一组值中的最大值
$qb = new QueryBuilder($mongo); $qb->collection("Orders") ->select("id", new Max("datecreated", "lastorder")) ->where("userid", "u123") ->find(); $result = $qb->toArray(); var_dump($result);
Min(string $property, ?string $alias = null) - 获取一组值中的最小值
$qb = new QueryBuilder($mongo); $qb->collection("Orders") ->select("id", new Min("datecreated", "lastorder")) ->where("userid", "u123") ->find(); $result = $qb->toArray(); var_dump($result);
Increment(string $propertyName, int $incrementBy = 1) - 通过一个值增加或减少文档属性
$qb = new QueryBuilder($mongo); $qb->collection("Orders") ->where("id", 12345) ->update([ new Increment("status") ]);
ArrayContains(string $arrayProperty, $needles) - 检查文档中的数组是否包含一个值(如果传递了数组,则至少包含一个值)
$qb = new QueryBuilder($mongo); $qb->collection("Orders") ->select("id") ->where(new ArrayContains("prioritaryItems", "123")) ->findAll(); $result = $qb->toArray(); var_dump($result);
ArrayLength(string $arrayProperty, ?string $alias = null) - 获取数组的长度
$qb = new QueryBuilder($mongo); $qb->collection("Orders") ->select("id", new ArrayLength("prioritaryItems", "prioritaryItems_lenght")) ->where("prioritaryItems_lenght", ">", 0) ->findAll(); $result = $qb->toArray(); var_dump($result);
ArrayPush(string $arrayProperty, mixed $value) - 向数组中添加一个元素。例如:具有tokens
属性且为数组的文档
$qb = new QueryBuilder($mongo); $qb->collection("Users") ->where("id", 123) ->update([ new ArrayPush("tokens", "...") ]); $result = $qb->toArray(); var_dump($result);
ArrayPull(string $arrayProperty, mixed $value) - 从数组中删除一个元素。例如:具有tokens
属性且为数组的文档
$qb = new QueryBuilder($mongo); $qb->collection("Users") ->where("id", 123) ->update([ new ArrayPull("tokens", "...") ]); $result = $qb->toArray(); var_dump($result);
调试查询:
您可以调试查询构建器为每个查询构建的查询管道。
QueryBuilder::$pipelineDebug = true; // Enable pipeline debugging! // Run a query $result = (new QueryBuilder())->collection("xyz") ->where("active", true) ->findAll() ->toArray(); // Fetch the pipeline built by the Query Builder var_dump(QueryBuilder::getLastPipelineLog()); // Get the pipeline built for the last query var_dump(QueryBuilder::getPipelineLogs()); // Get all pipelines ever built by the query builder
有关更多示例,请参阅examples
目录。