如何在 mongodb 查询中传递一个空的 php 变量

How to pass an empty php variable in mongodb query

我想创建一个动态 mongodb 查询,如果条件为真,则插入聚合的每个部分,否则不要注入该部分。

例如,我想检查时间是否在凌晨 1 点到早上 8 点之间如果是,则将定义的数组传递给 mongodb 查询,否则什么也不传递。

if ($this->Not_in_1_8 == true) {
    $this->N_IN_1_8 = array('dont_show_between_1_n_8' => array('$ne' => true));
}else {
    $this->N_IN_1_8 = null;
}
$MidnightCheck = $this->N_IN_1_8;
$this->campaign = Bcamp::raw(function ($collection) use ($seat_category_list, $banner_size, $seat_filter_list, $gold_network, $MidnightCheck) {
    return $collection->aggregate([
        [
            '$match' => [
                '$and' => [
                    ["targets.cats" => [
                        '$in' => $seat_category_list
                        ]
                    ],
                    ['banners.' . $banner_size => [
                        '$exists' => true
                        ]
                    ],
                    ['href' => [
                        '$nin' => $seat_filter_list
                        ]
                    ],
                    ['targets.gold_network' => [
                        '$eq' => $gold_network
                        ]
                    ],
                    ['status' => [
                        '$ne' => "Low_Budget"
                        ]
                    ],
                    ['daily_budget_status' => [
                        '$ne' => "Low_Budget"
                        ]
                    ],
                    $MidnightCheck
                ]
            ]
        ],
        [
            '$project' => [
                'ab' => [
                    '$cmp' => [
                        '$budget', '$click_cost'
                    ]
                ]
            ]
        ],
        [
            '$match' => [
                'ab' => [
                    '$lt' => 1
                ]
            ]
        ]

    ]);
});

但是在这个例子中,它将 null 注入查询并使其出错,我发现错误:bad query: BadValue: $or/$and/$nor entries need to be full objects

我改成$this->N_IN_1_8 = '';还是没有成功。

我只需要一个中性变量或条件来传递,如果条件为假,则不会影响查询。 任何想法?

仅供参考:我正在使用 Laravel 5.3 框架和 jenssegers/laravel-mongodb 用于 mongodb

的软件包

希望保持代码结构不变,即当条件代码中未使用预建数组时,您可以将 $MidnightCheck 保持为 null 并用 [=17 包装数组=]:

return $collection->aggregate([
[
    '$match' => [
        '$and' => array_filter([
            ["targets.cats" => ['$in' => $seat_category_list]],
            ['banners.' . $banner_size => ['$exists' => true]],
            ['href' => ['$nin' => $seat_filter_list]],
            ['targets.gold_network' => ['$eq' => $gold_network]],
            ['status' => ['$ne' => "Low_Budget"]],
            ['daily_budget_status' => ['$ne' => "Low_Budget"]],
            $MidnightCheck
        ])
    ]
// ...

在没有第二个参数的情况下调用 array_filter 将从数组中过滤掉所有错误值,导致不需要的 $MidnightCheck 将消失。

我认为可能更清楚的是在回调中预先准备好条件:

$conditions = [
    ["targets.cats" => ['$in' => $seat_category_list]],
    ['banners.' . $banner_size => ['$exists' => true]],
    ['href' => ['$nin' => $seat_filter_list]],
    ['targets.gold_network' => ['$eq' => $gold_network]],
    ['status' => ['$ne' => "Low_Budget"]],
    ['daily_budget_status' => ['$ne' => "Low_Budget"]],
];
if ($MidnighCheck) {
    $conditions[] = $MidnightCheck;
}
return $collection->aggregate([
    ['$match' => [ '$and' => $conditions ],]
])