Mongodb PHP - целые числа с десятичными числами - PullRequest
4 голосов
/ 25 января 2012

Это продолжение моего поста о вставке целого числа в mongodb. У меня это работает просто отлично с помощью (int), но теперь, когда он вставляет число в БД, все полосы после десятичной дроби. Поэтому, если бы у меня было 154.65, оно было бы вставлено в mongodb как 154. Ничего после десятичного числа.

Мой вопрос: как мне получить это, чтобы сохранить все числа после десятичной? Также, если у кого-то есть ссылка на эти строковые / числовые функции, я был бы признателен за ссылку. Спасибо.

$number["xyz"]    = (int) $_POST["number"] ;
$collection->insert($number);

Это вставляет его как целое число, но удаляет все после десятичного числа. Я попробовал тебе предложение

$number["xyz"]    = floatval($_POST["number"]) ;
$collection->insert($number);

но это все равно удаляет все после десятичной дроби. Хотя мне нужно что-то похожее на это, чтобы оно было в формате монго:

$number["xyz"]    = (dec) $_POST["number"] ;
$collection->insert($number);

Ответы [ 3 ]

5 голосов
/ 14 ноября 2012

Я постараюсь прояснить это для вас, ребята, потому что это было немного ошеломляющим, когда я пытался отсортировать цены в списках категорий товаров.

Способ, которым я смог создать десятичные числа в монго, на самом деле заключался в том, чтобы хранить значения как числа с плавающей запятой.

Вы также можете вставить в виде центов с помощью int или MongoInt64 (затем разделите на 100, чтобы получитьобратно в доллары).Вот мой код вставки / импорта с использованием класса mongo php.

$m = new Mongo();
$db = $m->selectDB("test");
$collection = new MongoCollection($db, 'numInt');
$collection2 = new MongoCollection($db, 'numFloat');
$collection3 = new MongoCollection($db, 'numLong');

$collection->insert(array('Integer' => (int)123.54));//I tried a decimal just to see...nope...gets cut off
$collection->insert(array('Integer' => (int)54321));
$collection->insert(array('Integer' => (int)12345));

$collection2->insert(array('Float' => (float)12354));
$collection2->insert(array('Float' => (float)54321));
$collection2->insert(array('Float' => (float)123.45));//*********This was stored as decimal in database results

$collection3->insert(array('Mongo64'=>new MongoInt64('54234.45')));//I tried a decimal just to see...nope...gets cut off
$collection3->insert(array('Mongo64'=>new MongoInt64('75432')));
$collection3->insert(array('Mongo64'=>new MongoInt64('12345')));


//results

//first example int and MongoInt64 (NumberLong in PHP) ***sorted ascending
echo "<strong>Integer Example</strong><br />
           --------------------<br />";

$cursor = $collection->find();
$cursor->sort(array('Integer'=>1));            
foreach($cursor as $obj){
   echo ($obj['Integer']/100)."<br />";
}

echo "<br />";
//second example float ***sorted ascending
echo "<strong>Float Example</strong><br />
              ----------------------------<br />";

$cursor2 = $collection2->find();
$cursor2->sort(array('Float'=>1)); 
foreach($cursor2 as $obj){
   echo ($obj['Float']/100)."<br />";
}

echo "<br />";
//third example float ***sorted ascending
echo "<strong>Number Long (MongoInt64) Example</strong><br />
              ------------------------------<br />";

$cursor3 = $collection3->find();
$cursor3->sort(array('Mongo64'=>1)); 
foreach($cursor3 as $obj){
   echo ($obj['Mongo64']/100)."<br />";
}

Это вывод из php-кода, который я разместил выше ....

Integer Example
--------------------
1.23
123.45
543.21

Float Example
----------------------------
1.2345
123.54
543.21

Number Long (MongoInt64) Example
------------------------------
123.45
542.34
754.32

Вот результаты поиска () для каждой из коллекций в монгооболочка

> db.numInt.find()
{ "_id" : ObjectId("50a322508c85671a2b000000"), "Integer" : 123 }
{ "_id" : ObjectId("50a322508c85671a2b000001"), "Integer" : 54321 }
{ "_id" : ObjectId("50a322508c85671a2b000002"), "Integer" : 12345 }
> db.numFloat.find()
{ "_id" : ObjectId("50a322508c85671a2b000003"), "Float" : 12354 }
{ "_id" : ObjectId("50a322508c85671a2b000004"), "Float" : 54321 }
{ "_id" : ObjectId("50a322508c85671a2b000005"), "Float" : 123.45 }
> db.numLong.find()
{ "_id" : ObjectId("50a322508c85671a2b000006"), "Mongo64" : NumberLong(54234) }
{ "_id" : ObjectId("50a322508c85671a2b000007"), "Mongo64" : NumberLong(75432) }
{ "_id" : ObjectId("50a322508c85671a2b000008"), "Mongo64" : NumberLong(12345) }
>
5 голосов
/ 25 января 2012

Нет изначально поддерживаемого десятичного формата. Возможные варианты: числа с плавающей точкой (приведено до сохранения), целое число (которое приводит к удалению десятичных дробей, как вы видите) или строка (приведено до сохранения). Оптимальный выбор зависит от ваших функциональных требований. Например, если это денежное значение, вы не хотите использовать числа с плавающей запятой, но сохраняете значение в центах как целое число (15465 в вашем примере).

3 голосов
/ 25 января 2012

Посмотрите, что на самом деле дает вам $_POST["number"];, распечатав это. У меня есть ощущение, что ваша проблема заключается во входных данных. Все эти работы, как и ожидалось:

$collection->insert(array("test"=>"a","float"=>123.45));
$collection->insert(array("test"=>"b","float"=>floatval("123.45")));
$test = array("test"=>"c","float"=>123.45);
$collection->insert($test);

Результат:

db.test.find();
{ "_id" : ObjectId("4f2036a6eabc88dd0e000006"), "test" : "a", "float" : 123.45 }
{ "_id" : ObjectId("4f2036a6eabc88dd0e000007"), "test" : "b", "float" : 123.45 }
{ "_id" : ObjectId("4f2036a6eabc88dd0e000008"), "test" : "c", "float" : 123.45 }

Добавление еще нескольких примеров для целых чисел:

$collection->insert(array("test"=>"inta","int"=>new MongoInt32("12345")));
$collection->insert(array("test"=>"intb","int"=>new MongoInt64("123456789")));

приводит к (по крайней мере, в моей системе):

{ "_id" : ObjectId("4f20431feabc88cf3500001b"), "test" : "inta", "int" : 12345 }
{ "_id" : ObjectId("4f20431feabc88cf3500001c"), "test" : "intb", "int" : NumberLong(123456789) }

Итак, вы должны быть несколько осторожны, если хотите хранить числа как "реальные целые числа" в mongodb.

Обновление Я был исправлен кем-то в 10gen тем, что целые числа PHP обычно хранятся как целые числа в монго, даже если тип в оболочке показывает Number. Существует также параметр для драйвера PHP mongo, который позволяет вам указать это поведение «native_long». http://php.net/manual/en/mongo.configuration.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...