如何在 WHERE 中使用 IFNULL() 表达式从 PHP 查询 MongoDB?

How do I query MongoDB from PHP with IFNULL() expression inside WHERE?

我使用此查询将 NULL 值查询为“0”:

select * from myTable where IFNULL(field_id, 0) = 0

如何使用 PHP 在 MongoDB 中实现同样的效果?

我的代码:

/**
 * @var MongoDB
 */
$db = $this->getMongoDbHandler();

/**
 * @var MongoCollection
 */
$coll = $db->selectCollection('myColl');

/**
 * @var MongoCursor
 */
$cursor = $coll->find($where);

我该如何组成$where数组?

我想我应该这样做:

$where['field_id'] = [
    '$ifNull' => ['field_id', 0]
];

但是我应该在哪里指定所需的值?

谢谢!

创建一个变量来保存 return 空合并表达式的 JavaScript 函数。这是一些示例测试文档,用于在 mongo shell:

中对此进行测试
db.test.insert([
    { _id: 1, field_id: 0 },
    { _id: 2, test_field: 1 },
    { _id: 3, field_id: null },    
    { _id: 4, field_id: 3 }
])

我希望我的查找查询使用 $where 运算符来 return 具有 _ids 1,2 和 3 的文档,因此查询的输出

db.test.find({ "$where": "function() { return (this.field_id || 0) == 0; }" })

会是

/* 0 */
{
    "_id" : 1,
    "field_id" : 0
}

/* 1 */
{
    "_id" : 2,
    "test_field" : 1
}

/* 2 */
{
    "_id" : 3,
    "field_id" : null
}

此 PHP 示例演示了如何使用 javascript 代码搜索集合以使用上述相同概念减少结果集:

<?php

/**
 * @var MongoDB
 */
$db = $this->getMongoDbHandler();

/**
 * @var MongoCollection
 */
$coll = $db->selectCollection('myColl');

/**
 * @var JavaScript code
 */
$js = "function() { return (this.field_id || 0) == 0; }" ;

/**
 * @var MongoCursor
 */ 
$cursor = $coll->find(array('$where' => $js));

foreach ($cursor as $doc) {
    var_dump($doc);
}

?>