Как запросить MongoDB из PHP с выражением IFNULL () внутри WHERE?

1

Я использую этот запрос для запроса значений NULL как "0":

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

Как я могу добиться того же в MongoDB с помощью PHP?

Мой код:

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

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

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

Как мне создать $where array?

Думаю, я должен сделать что-то вроде:

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

Но где я тогда указываю требуемое значение?

Благодарю!

Теги:
where
ifnull

1 ответ

1
Лучший ответ

Создайте переменную для хранения функции JavaScript, которая возвращает нулевое коалесцирующее выражение. Вот несколько примеров тестовых документов для проверки этого в оболочке mongo:

db.test.insert([
    { _id: 1, field_id: 0 },
    { _id: 2, test_field: 1 },
    { _id: 3, field_id: null },    
    { _id: 4, field_id: 3 }
])

Я бы ожидал, что мой запрос на поиск, который использует оператор $where для возврата документов с помощью _id 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);
}

?>
  • 1
    Потрясающе, высоко ценится!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню