Pharo、Voyage 和 MongoDB

Hen*_*hov 4 smalltalk pharo mongodb

我想使用 Pharo、Voyage 和 MongoDB + TeaPot 构建一个相对简单的 Web 应用程序。在我开始这个项目之前,我做了很多研究,但仍然有一个问题:我最初如何将一堆数据上传到 MongoDB?我基本上有CSV格式的数据。我是否必须在 Smalltalk 中编写一个导入程序来做到这一点?如果我在没有 smalltalk 的情况下做它会丢失所有对象 ID 等。你如何处理这样的事情?

谢谢,亨里克

tuk*_*kan 6

如果您有CSV格式的数据,那么我建议创建一个简单的导入器。您可以使用NeoCSV然后通过 Pharo 保存它。我想您知道如何设置 Mongo 存储库(@workspace):

| repository |
repository := VOMongoRepository 
              host: VOMongoRepository defaultHost 
              database: 'MyMongoDb'.
VORepository setRepository: repository.
Run Code Online (Sandbox Code Playgroud)

首先为 Voyage 创建两个类方法:

Kid class >> isVoyageRoot
    ^ true "instances of this object will be root"

Kid class >> voyageCollectionName
    ^ 'Kids' "The collection name in MongoDB"
Run Code Online (Sandbox Code Playgroud)

Kid 类应该有同名的firstName(:), surname(:), age(:)accesors 和实例变量。

然后只需读取CSV并保存到mongoDB

| personalInformation readData columnName columnData aKid |
"init variable"
personalInformation := OrderedDictionary new.
"emulate CSV reading"
readData := (NeoCSVReader on: 'firstName, surname, age\John, Smith, 5' withCRs readStream) upToEnd.
columnName := readData first.
columnData := readData second.
"Repeat for as many number of columns you may have"
1 to: columnName size do: [ :index |
    personalInformation at: (columnName at: index) put: (columnData at: index)
].
aKid := Kid new.   
"Storing Kid object information"
personalInformation keysAndValuesDo: [ :key :value |
    aKid perform: (key asString,$:) asSymbol with: value "For every column store the information into a Kid object (you have to have accessors for that)"
].
aKid save "Saving into mongoDB"
Run Code Online (Sandbox Code Playgroud)

这只是给你一个粗略的想法

要在您的 MongoDB 中查询,请执行以下操作:

db.Kids.find()

您应该会看到存储的信息。

免责声明:即使你的代码应该没问题,我也没有时间在 mongoDB 上实际测试它。