2013-08-14 4 views
1

Предположим, что я вставил следующий документ с PHP (обратите внимание на "ó".)MongoDB PHP проблемы акцент

$dbs->insert(array('name' => 'televisión')); 

В MongoDB сервер базы данных сохраняется следующим

{ "name" : "televisi��n" } 

Если я вызываю метод findOne следующим образом (Примечание с уплотнительным)

$doc = $dbs->findOne(array('name' => "televisión")); 

Это вернуть мне правильное значение

[name] => televisión 

Все отлично, пока здесь.

Итак, представьте, что из php мне нужно определить, что документ televisión находится в базе данных mongodb, но я получаю значение от URL без акцента «-», т. Е. Телевидение.

$doc = $dbs->findOne(array('name' => "television")); 

метод findOne возвращает null, поэтому не соответствует документу.

Есть ли способ для этого не вернуть нулевое значение и может найти документ независимо от акцента?

Заранее благодарен!

+0

Вам нужно кодировать utf8 – Sammaye

+0

не специфична для Монго, но таже назад старая проблема: [Обработка Unicode спереди назад в веб-приложения] (HTTP: // kunststube .net/backback /) – deceze

+0

@Sammaye Я пробовал, но он хранит документ, как следует televisi n – oletob

ответ

1

In mongodb database server is saved as follows

{ "name" : "televisi��n" }

Возможно, это связано с тем, что ваша оболочка не отображает UTF-8 должным образом.

А:

Is there any way for this not return null value and can find the document regardless of the accent?

Вы можете сделать это с помощью нового текстового поиска функциональности:

<?php 
$m = new MongoClient; 
$d = $m->test; 
$c = $d->so; 

// Just dropping here to create a controlled output - no need to do this yourself. 
$c->drop(); 

$c->ensureIndex(
    array('name' => 'text'), 
    array('default_language' => 'spanish') 
); 

$c->insert(array('name' => 'televisión')); 

$res = $d->command(array('text' => 'so', 'search' => 'television')); 

var_dump($res['results']); 
?> 

который выводит:

array(1) { 
    [0] => 
    array(2) { 
    'score' => 
    double(1) 
    'obj' => 
    array(2) { 
     '_id' => 
     class MongoId#6 (1) { 
     ... 
     } 
     'name' => 
     string(11) "televisión" 
    } 
    } 
} 

Для поиска текста на работу, вам нужно MongoDB 2.4.x, и вам нужно специально включить его с флагом --setParameter textSearchEnabled=true до mongod или добавить в код:

$d->command(array('setParameter' => 1, 'textSearchEnabled' => true)); 
+0

Когда я пытаюсь использовать метод команды, я получаю следующую ошибку: - Вызов неопределенного метода MongoCollection :: command(). - У меня установлена ​​версия mongodb 2.4.5 – oletob

+0

Вам нужно вызвать команду «command» в переменной базы данных, а не в переменной коллекции, как показывает мой ответ/пример. – Derick

+0

Зачем использовать для этого индекс fts? Он только пытается сделать простую находку(), почему болото и замедляет вставки с такой огромной задачей индекса? Я уверен, что есть лучшие способы – Sammaye

Смежные вопросы