MongoDB обновлять данные со скриптом

есть ли возможность обновлять данные в mongodb с помощью какого-то скрипта? Я не хочу (не могу) получить доступ к оболочке mongo, но хотел бы выполнить запросы обновления mongoshell. Мои данные-это csv-файл. Я использую hadoop для анализа данных (извлечение и преобразование). Мне нужно вернуть данные в MongoDB и обновить некоторые атрибуты. В качестве ссылки для обновления я хотел бы использовать сгенерированный id

можно ли выполнить эту задачу?

любая помощь был бы очень признателен

2 ответов


вы хотите прочитать данные из CSV-файла и импортировать в mongodb? Вы можете создать файл сценария (javascript) и использовать оболочку mongo для его выполнения, как описано в "сценарии оболочки".

пример сеанса, тестовая база данных, начиная с пустой коллекции foo:

> db.foo.insert({name : "james", position : "forward"})
> db.foo.find()
{ "_id" : ObjectId("4f0c99f6cb435f1e7d7fedea"), "name" : "james",     "position" : "forward" }
> 

затем вы создаете свой скрипт, скажем, mongo_scripting.js:

db.foo.insert({name : "wade", position : "guard"});
db.foo.update({name : "james"}, {$set : {position : "power forward"}}, false, true);

и запустив скрипт:

mongo localhost:27017/test  mongo_scripting.js

возвращаясь к монго:

> db.foo.find()
{ "_id" : ObjectId("4f0c99f6cb435f1e7d7fedea"), "name" : "james", "position" : "power forward" }
{ "_id" : ObjectId("4f0c9a64a4a4642bae6459ea"), "name" : "wade",     "position" : "guard" }
> 

вы видите, что один документ был обновлен и один новый вставлен.

альтернативой является использование java / python... драйвер для загрузки данных.


Если вы вообще можете подключиться к MongoDB, то вы наверняка можете использовать оболочку. Просто запустите оболочку на локальном компьютере и скажите ей подключиться к удаленному экземпляру Mongo, например:

монго dbserver.mydomain.com/foo

вы также можете рассмотреть возможность использования mongoimport,http://www.mongodb.org/display/DOCS/Import + экспорт + инструменты, хотя mongoimport захочет создавать или заменять целые документы, а не обновлять поля в документах, как вы спросил.

Мне кажется, вам нужно написать сценарий для обработки каждой строки CSV и обновления документов в MongoDB. В Python этот скрипт будет выглядеть примерно так:

import csv, pymongo, sys
foo_db = pymongo.Connection("dbserver.mydomain.com").foo
csv_reader = csv.reader(open(sys.argv[1], 'rb'), delimiter=',', quotechar='"')
for line in csv_reader:
    _id, field1, field2 = line
    foo_db.my_collection.update({
        "_id": _id
    }, {
        "$set": { "field1": field1, "field2": field2 }
    }, safe=True)