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 )