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
)