Обновление: с выпуском Cloud Functions для Firebase есть еще один элегантный способ сделать это, а также связывая Firebase с Algolia через функции . Компромисс здесь заключается в том, что функции / Algolia практически нулевое обслуживание, но, вероятно, при увеличении стоимости по сравнению с roll-your-own в узле.
В Firebase в настоящее время нет запросов на контент. Многие из наиболее распространенных сценариев поиска, такие как поиск по атрибуту, будут испечены в Firebase по мере расширения API.
Между тем, безусловно, возможно вырастить свои собственные. Тем не менее, поиск - это обширная тема (думаю, создание огромного хранилища данных в реальном времени), сильно заниженная и критическая особенность вашего приложения - не тот, который вы хотите сделать ad hoc или даже зависеть от кого-то вроде Firebase, чтобы предоставить от вашего имени , Поэтому обычно проще использовать масштабируемый сторонний инструмент для обработки индексирования, поиска, сопоставления тегов / шаблонов, нечеткой логики, взвешенных ранжировок и т. Д.
В блоге Firebase есть сообщение в блоге по индексированию с ElasticSearch , который описывает простой подход к интеграции быстрой, но чрезвычайно мощной поисковой системы в ваш сервер Firebase.
По сути, это делается в два этапа. Контролируйте данные и индексируйте их:
var Firebase = require('firebase');
var ElasticClient = require('elasticsearchclient')
// initialize our ElasticSearch API
var client = new ElasticClient({ host: 'localhost', port: 9200 });
// listen for changes to Firebase data
var fb = new Firebase('.firebaseio.com/widgets');
fb.on('child_added', createOrUpdateIndex);
fb.on('child_changed', createOrUpdateIndex);
fb.on('child_removed', removeIndex);
function createOrUpdateIndex(snap) {
client.index(this.index, this.type, snap.val(), snap.name())
.on('data', function(data) { console.log('indexed ', snap.name()); })
.on('error', function(err) { /* handle errors */ });
}
function removeIndex(snap) {
client.deleteDocument(this.index, this.type, snap.name(), function(error, data) {
if( error ) console.error('failed to delete', snap.name(), error);
else console.log('deleted', snap.name());
});
}
Запросите индекс, когда хотите выполнить поиск:
Есть пример, а сторонняя библиотека для упрощения интеграции здесь.
Вы не можете привязать «NOT NULL». Вы можете привязать только значения . «IS NOT NULL» не является значением, это совершенно другой синтаксис запроса. Вам просто нужно динамически строить запрос, привязка значения не может помочь вам в этом:
$query = 'SELECT ... WHERE ';
if (/* condition is NOT NULL */) {
$query .= 'foo IS NOT NULL';
$stmt = $db->prepare($query);
} else {
$query .= 'foo = :foo';
$stmt = $db->prepare($query);
$stmt->bindValue('foo', $foo);
}
$stmt->execute();
Боюсь, вы ошибаетесь в своем предположении. Хотя вы можете связать значения NULL в целом, оператор WHERE bar = NULL
не вернет вам никаких строк, ни с помощью необработанного SQL, ни из PDO. Весь этот оператор будет вычисляться до NULL и не будет соответствовать ни одной строке.
Вместо этого вы можете использовать NULL-безопасный, равный оператору <=>
, для соответствия полям, которые являются либо NULL, либо имеют некоторые стоимость. Но чтобы иметь значения, которые не равны нулю, вы все равно должны иметь другой запрос.