Query building » Advanced queries
See an example of building large and complex queries with QueryBuilder and the MondocBuilder library.
Example code
The code below demonstrates how to build a complex query using the QueryBuilder instance, part of the MondocBuilder library.
<?php
use District5\Mondoc\Helper\MondocTypes;
use District5\MondocBuilder\QueryBuilder;
use District5\MondocBuilder\QueryTypes\KeyExists;
use District5\MondocBuilder\QueryTypes\OrOperator;
use District5\MondocBuilder\QueryTypes\ValueEqualTo;
use District5\MondocBuilder\QueryTypes\ValueGreaterThanOrEqualTo;
use District5\MondocBuilder\QueryTypes\ValueLessThanOrEqualTo;
use District5\MondocBuilder\QueryTypes\ValueNotEqualTo;
use District5\MondocBuilder\QueryTypes\ValueNotInValues;
$dateFrom = new DateTime();
$dateFrom->sub(new DateInterval('P1D'));
$dateTo = new DateTime();
$idOne = MondocTypes::toObjectId('6612d694ee06f31b062f7fd0');
$idTwo = MondocTypes::toObjectId('5e6257472afe4b41e941942e');
$queryBuilder = QueryBuilder::get();
$or = OrOperator::get();
$firstOr = QueryBuilder::get();
$attachmentOneOne = ValueNotEqualTo::get()->null('attachment.userId');
$attachmentTwoOne = ValueNotEqualTo::get()->null('attachment.orgId');
$isSpamOne = ValueEqualTo::get()->boolean('isSpam', false);
$createdGreaterThanOne = ValueGreaterThanOrEqualTo::get()->dateTime('createdDate', $dateFrom);
$createdLessThanOne = ValueLessThanOrEqualTo::get()->dateTime('createdDate', $dateTo);
$notInOne = ValueNotInValues::get()->anArray('sourceId', [$idOne, $idTwo]);
$sourceOne = ValueEqualTo::get()->string('source', 'job-application');
$hasEncryptionOne = KeyExists::get()->false('hasEncryption');
$firstOr->addQueryPart(
$attachmentOneOne
)->addQueryPart(
$attachmentTwoOne
)->addQueryPart(
$isSpamOne
)->addQueryPart(
$createdLessThanOne
)->addQueryPart(
$createdGreaterThanOne
)->addQueryPart(
$notInOne
)->addQueryPart(
$sourceOne
)->addQueryPart(
$hasEncryptionOne
);
$or->addBuilder($firstOr);
$secondOr = QueryBuilder::get();
$attachmentOneTwo = ValueNotEqualTo::get()->null('attachment.userId');
$attachmentTwoTwo = ValueNotEqualTo::get()->null('attachment.orgId');
$isSpamTwo = ValueEqualTo::get()->boolean('isSpam', false);
$createdGreaterThanTwo = ValueGreaterThanOrEqualTo::get()->dateTime('createdDate', $dateFrom);
$createdLessThanTwo = ValueLessThanOrEqualTo::get()->dateTime('createdDate', $dateTo);
$notInTwo = ValueNotInValues::get()->anArray('sourceId', [$idOne, $idTwo]);
$sourceTwo = ValueEqualTo::get()->string('source', 'job-application');
$hasEncryptionTwo = ValueEqualTo::get()->boolean('hasEncryption', true);
$secondOr->addQueryPart(
$attachmentOneTwo
)->addQueryPart(
$attachmentTwoTwo
)->addQueryPart(
$isSpamTwo
)->addQueryPart(
$createdLessThanTwo
)->addQueryPart(
$createdGreaterThanTwo
)->addQueryPart(
$notInTwo
)->addQueryPart(
$sourceTwo
)->addQueryPart(
$hasEncryptionTwo
);
$or->addBuilder($secondOr);
$thirdOr = QueryBuilder::get();
$attachmentOneThree = ValueNotEqualTo::get()->null('attachment.userId');
$attachmentTwoThree = ValueNotEqualTo::get()->null('attachment.orgId');
$isSpamThree = ValueEqualTo::get()->boolean('isSpam', false);
$createdLessThanThree = ValueLessThanOrEqualTo::get()->dateTime('createdDate', $dateTo);
$createdGreaterThanThree = ValueGreaterThanOrEqualTo::get()->dateTime('createdDate', $dateFrom);
$notInThree = ValueNotInValues::get()->anArray('sourceId', [$idOne, $idTwo]);
$sourceThree = ValueEqualTo::get()->string('source', 'job-application');
$hasEncryptionThree = ValueEqualTo::get()->boolean('hasEncryption', false);
$scanExistsThree = ValueEqualTo::get()->string('scanState', 'scanned');
$thirdOr->addQueryPart(
$attachmentOneThree
)->addQueryPart(
$attachmentTwoThree
)->addQueryPart(
$isSpamThree
)->addQueryPart(
$createdLessThanThree
)->addQueryPart(
$createdGreaterThanThree
)->addQueryPart(
$notInThree
)->addQueryPart(
$sourceThree
)->addQueryPart(
$hasEncryptionThree
)->addQueryPart(
$scanExistsThree
);
$or->addBuilder($thirdOr);
$queryBuilder->addQueryPart($or);
// Let's add some options to the query
$options = $queryBuilder->getOptions();
$options->setSortBySimple('createdDate', 1);
$options->setSkip(0);
$options->setLimit(10);
$options->setCustom(['allowDiskUse' => true]);
print_r($queryBuilder->getArrayCopy());
print_r($queryBuilder->getOptions()->getArrayCopy());
//
// See below for the output
//
Example output
The code above will output the following query:
//
// Output from the code above:
//
// print_r($queryBuilder->getArrayCopy());
Array(
[$or] => Array(
[0] => Array(
[attachment.userId] => Array(
[$ne] => null
)
[attachment.orgId] => Array(
[$ne] => null
)
[isSpam] => Array(
[$eq] => false
)
[createdDate] => Array(
[$lte] => MongoDB\BSON\UTCDateTime Object(
[milliseconds] => 1724152934798
)
[$gte] => MongoDB\BSON\UTCDateTime Object(
[milliseconds] => 1721560934797
)
)
[sourceId] => Array(
[$nin] => Array(
[0] => MongoDB\BSON\ObjectId Object(
[oid] => 6612d694ee06f31b062f7fd0
)
[1] => MongoDB\BSON\ObjectId Object(
[oid] => 5e6257472afe4b41e941942e
)
)
)
[source] => Array(
[$eq] => job-application
)
[hasEncryption] => Array(
[$exists] => false
)
)
[1] => Array(
[attachment.userId] => Array(
[$ne] => null
)
[attachment.orgId] => Array(
[$ne] => null
)
[isSpam] => Array(
[$eq] => false
)
[createdDate] => Array(
[$lte] => MongoDB\BSON\UTCDateTime Object(
[milliseconds] => 1724152934798
)
[$gte] => MongoDB\BSON\UTCDateTime Object(
[milliseconds] => 1721560934797
)
)
[sourceId] => Array(
[$nin] => Array(
[0] => MongoDB\BSON\ObjectId Object(
[oid] => 6612d694ee06f31b062f7fd0
)
[1] => MongoDB\BSON\ObjectId Object(
[oid] => 5e6257472afe4b41e941942e
)
)
)
[source] => Array(
[$eq] => job-application
)
[hasEncryption] => Array(
[$eq] => true
)
)
[2] => Array(
[attachment.userId] => Array(
[$ne] => null
)
[attachment.orgId] => Array(
[$ne] => null
)
[isSpam] => Array(
[$eq] => false
)
[createdDate] => Array(
[$lte] => MongoDB\BSON\UTCDateTime Object(
[milliseconds] => 1724152934798
)
[$gte] => MongoDB\BSON\UTCDateTime Object(
[milliseconds] => 1721560934797
)
)
[sourceId] => Array(
[$nin] => Array(
[0] => MongoDB\BSON\ObjectId Object(
[oid] => 6612d694ee06f31b062f7fd0
)
[1] => MongoDB\BSON\ObjectId Object(
[oid] => 5e6257472afe4b41e941942e
)
)
)
[source] => Array(
[$eq] => job-application
)
[hasEncryption] => Array(
[$eq] => false
)
[scanState] => Array(
[$eq] => scanned
)
)
)
)
// print_r($queryBuilder->getOptions()->getArrayCopy());
Array
(
[sort] => Array(
[createdDate] => 1
)
[skip] => 0
[limit] => 10
[allowDiskUse] => 1
)