tcb13/sequel-mongo-php

1.1.18 2023-01-24 15:55 UTC

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条件、limitorder执行复杂查询。

// 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目录。