andydune / mongo-query
Add beauty to momgodb query arrays.
Requires
- php: >=7.1
- andydune/datetime: ^2
- andydune/mongo-odm: ^1
- mongodb/mongodb: ^1
Requires (Dev)
- mongodb/mongodb: ^1.1
- phpunit/phpunit: ^5.7.15 || ^6.0.8
README
Add beauty to momgodb query arrays. Less errors, less brackets, more understanding. It is not ORM or ODM, it's only builder. So you may feel free to use it standalone or with any orm like mongolid
Requirements
- PHP version >= 7.1
- A couple of beers in the fridge.
What is beauty
Originally it looks like:
$collection = (new MongoDB\Client)->shop->tobacco; $cursor = $collection->find(['price' => ['$lt' => 1000]]); $collection = (new MongoDB\Client)->shop->tobacco; $cursor = $collection->find(['type' => ['$in' => ['virginia', 'latakia']]]); // 3 brackets at once
MongoQuery change it:
$collection = (new MongoDB\Client)->shop->tobacco; $cursor = $collection->find((new Query)->field('price')->lessThan(1000)->get()); // or $cursor = (new Query)->field('price')->lessThan(1000)->find($collection); $collection = (new MongoDB\Client)->test->tobacco; $cursor = $collection->find((new Query)->field('type')->in('virginia', 'latakia')->get()); // or $cursor = (new Query)->field('type')->in('virginia', 'latakia')->find($collection)
Installation
Installation using composer:
composer require andydune/mongo-query
Or if composer didn't install globally:
php composer.phar require andydune/mongo-query
Or edit your composer.json
:
"require" : {
"andydune/mongo-query": "^1"
}
And execute command:
php composer.phar update
Execution
You can use methods find
or findOne
:
$query = new Query(); $query->field('price')->between(10, 100); $mongo = new \MongoDB\Client(); $collection = $mongo->selectDatabase('shop')->selectCollection('tobacco'); $result = $query->find($collection, ['sort' => ['name' => 1]])->toArray(); $result = $query->findOne($collection, ['sort' => ['name' => 1]]);
Elements of Beauty
Not
Operator make negative condition for right next operator in chain.
Important! It is not suitable for all operators.
In
Original:
$collection = (new MongoDB\Client)->base->tobacco; $cursor = $collection->find(['type' => ['$in' => ['virginia', 'latakia']]]); // if not $cursor = $collection->find(['type' => ['$not' => ['$in' => ['virginia', 'latakia']]]]); // to many brackets
More beauty
use AndyDune\MongoQuery\Query; $collection = (new MongoDB\Client)->test->tobacco; $cursor = $collection->find((new Query)->field('type')->in('virginia', 'latakia')->get()); //or $cursor = $collection->find((new Query)->field('type')->in(['virginia', 'latakia'])->get()); //or $cursor = $collection->find((new Query)->field('type')->in(['virginia'], 'latakia')->get());
Operation can be used with not
modifier.
$cursor = $collection->find((new Query)->field('type')->not()->in('virginia', 'latakia')->get());
Between
Original:
$collection = (new MongoDB\Client)->base->tobacco; $cursor = $collection->find( ['$and' => [ ['price' => ['$gt' => 10]], ['price' => ['$lt' => 100]] ]]);
More beauty
$collection = (new MongoDB\Client)->test->tobacco; $cursor = $collection->find( (new Query)->field('price')->between->(10, 100)->get() );
Operation can be used with not
modifier.
(new Query)->field('price')->not()->between->(10, 100)->get()
eq
Matches values that are equal to a specified value.
(new Query)->field('price')->eq->(10)->get(); // ['price' => ['$eq' => 10]]
Operation can not be used with not
modifier. It is special method ne
ne
Matches all values that are not equal to a specified value.
(new Query)->field('price')->ne->(10)->get(); // ['price' => ['$ne' => 10]]
Operation can not be used with not
modifier.
gt and lt
Operators for $gt
and $lt
comparision.
(new Query)->field('price')->lt->(10)->get(); (new Query)->field('price')->gt->(100)->get();
Operation can not be used with not
modifier.
Nested queries
Query objects can be the conditions of new query. There is method addQuery
for this.
$query = new Query(); $query->field('price')->gt(80); $queryAdd = new Query(); $queryAdd->field('price')->lt(100); $data = $query->addQuery($queryAdd)->get();
Data type correction
It's important to use as parameters for query data with type same as data in collection.
So 1 != '1'
.
Query
constructor can receive array with meta description for fields.
$query = new Query([ 'price' => 'int', 'type' => 'string', ]); $queryArray = $queryAdd->field('price')->gt(false)->get(); // after all: $queryArray = [ 'price' => ['$gt' => 0] // (int)false -> 0 ];
Datetime type
You can use simple types for datetime.
Integer value is use as timestamp:
$query = new Query(['date' => 'datetime']); $query->field('date')->lt(time() - 60); // documents with date 60 seconds old
String must be Y-m-d H:i:s format:
$query = new Query(['date' => 'datetime']); $query->field('date')->between(date(time() - 60, 'Y-m-d H:i:s'), time()); // documents between date 60 seconds old and now
String with prefix -
or +
$query = new Query(['date' => 'datetime']); $query->field('date')->between('- 5 days', '+ 5 minutes'); // 5 days before and 5 minutes to future
Using type AndyDune\DateTime\DateTime
use AndyDune\DateTime\DateTime; $query = new Query(['date' => 'datetime']); $query->field('date')->eq(new DateTime());