Как добавить / обновить динамические счетчики в Mongodb? - PullRequest
0 голосов
/ 14 декабря 2011

Вот мой CSV-файл:

12;France;http://www.google.com
12;France;http://www.google.com

Для каждой строки структура $ field [], которую я использую для заполнения моего Mongo Объект выглядит следующим образом:

array(18) {
  ["date_day"]=>  int(12)
  ["url"]=>  string(21) "http://www.google.com"
  ["country"]=>  string(6) "France"
}

Для каждой из этих двух строк я называю следующее:

$result = $coll->update ( array ( 'ts_day' => $field['date_day'] ,'url'=>$field['url']),array('$addToSet' => array ( "countries" => array ( 'name' =>$field['country'] )) ),array ('upsert' => true ));

$result = $coll->update ( array ( 'ts_day' => $field['date_day'] ,'url' => $field['url'] , 'countries.name' => $field['country'] ),array ( '$inc' => array( 'countries.$.views'=> 1) ) ,array ( 'upsert' => true));

Я не понимаю, почему я получаю дополнительный {"name": "France"} объект в массив "стран", без счетчика "просмотров", хотя счетчик должным образом увеличивается в страновом.франции.views (значение которого 2, что правильно):

{ "_id" : ObjectId("4eeb0e6cd86450af72f775be"), "url" : "http://www.google.com", "countries" : [ { "name" : "France", "views": 2 }, { "name" : "France" } ], "ts_day" : 12 }

Есть идеи для этого одинокого {"name": "France"}? Ошибка Монго или мое недоразумение?

Спасибо!

Ответы [ 3 ]

1 голос
/ 14 декабря 2011

Похоже, вы слишком зациклены на использовании стандартных инструментов mongoimport / export для обработки файлов CSV.

Если вы посмотрите исходный код, вы заметите, что эти два инструмента являются довольно простыми клиентскими приложениями, использующими драйвер MongoDB C ++. Если бы они были написаны на Python или Ruby, они бы хотели иметь длину всего 5-10 строк.

Почему бы вам просто не написать новый скрипт, который читает файл CSV и вставляет документы именно так, как вы хотите? Хотите сделать агрегацию? Сделайте это в коде клиента! Хотите полный контроль над схемой? Вы настроены!

На самом деле, это был бы лучший способ продвижения вперед - для удобства, а не для полноты, предоставляется монгоимпорт / экспорт. Если процесс загрузки данных требует значительного обновления большого количества документов после того, как они уже записаны в базу данных, вы можете даже начать видеть проблемы с уплотнением и производительностью.

0 голосов
/ 19 декабря 2011

Это помогает:

$ result = $ coll-> update (array ('ts_year' => $ field ['date_year'], 'ts_month' => $ field ['date_month'], 'ts_day' => $ field ['date_day'], 'asset' => $ field ['url']), массив ('$ inc' => массив ("страны.". $ field ['страна']). ". views" => 1)), массив ('upsert' => true));

0 голосов
/ 14 декабря 2011

Вам необходимо использовать оператор $ inc. Это увеличит целевое поле, если оно соответствует указанным вами критериям.

http://www.mongodb.org/display/DOCS/Updating#Updating-%24inc

...