2012-01-10 246 views
6

有没有可能用某种脚本更新mongodb中的数据? 我不想(不能)访问mongo shell - 但想执行mongoshell更新查询。 我的数据是一个csv文件。我使用hadoop来分析数据(提取和转换)。我需要将数据返回到mongodb并更新一些属性。作为更新的参考,我想使用生成的ID用脚本MongoDB更新数据

可以完成此任务吗?

任何帮助将是非常赞赏

回答

10

你想从一个CSV文件中读取数据,并导入到MongoDB的?您可以生成脚本文件(javascript)并使用mongo shell来执行它,如“scripting the shell”中所述。

例会话,测试数据库,从一个空富集合:

> 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 

回到mongo:

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

您会看到一个文档被更新并且一个新插入。

另一种方法是使用java/python ...驱动程序来加载数据。

+0

嗨,它不只是一个导入。我想更新现有数据。我看着“脚本shell”。但它没有太多的帮助 - 或者我错过了什么? – Backlit 2012-01-10 18:54:12

+0

我不明白你为什么困惑,让我更新答案。 – milan 2012-01-10 20:04:47

+0

thx u milan - 它的作品完美 – Backlit 2012-01-11 10:07:00

2

如果你可以连接到MongoDB,那么你一定可以使用shell。只要你的本地计算机上运行的外壳,并告诉它连接到远程蒙戈实例,如:

蒙戈dbserver.mydomain.com/foo

您也可以考虑使用mongoimport,http://www.mongodb.org/display/DOCS/Import+Export+Tools,虽然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)