Вставить несколько записей в базу данных с Vapor3 - PullRequest
0 голосов
/ 17 сентября 2018

Я хочу иметь возможность массового добавления записей в базу данных nosql в Vapor 3.

Это моя структура.

struct Country: Content {

   let countryName: String
   let timezone: String
   let defaultPickupLocation: String

}

Итак, я пытаюсь передать массив объектов JSON, но я не уверен, как структурировать маршрут или как получить доступ к массиву для декодирования каждого из них.

Я пробовал этот маршрут:

    let countryGroup = router.grouped("api/country")

    countryGroup.post([Country.self], at:"bulk", use: bulkAddCountries)

с этой функцией:

 func bulkAddCountries(req: Request, countries:[Country]) throws ->  Future<String> {
    for country in countries{
    return try req.content.decode(Country.self).map(to: String.self) { countries in



        //creates a JSON encoder to encode the JSON data
        let encoder = JSONEncoder()
        let countryData:Data
        do{
            countryData = try encoder.encode(country) // encode the data
        } catch {
            return "Error. Data in the wrong format."
        }
        // code to save data
    }
    }
}

Итак, как мне структурировать маршрут и функцию, чтобы получить доступ к каждой стране?

1 Ответ

0 голосов
/ 19 сентября 2018

Я не уверен, какую базу данных NoSQL вы планируете использовать, но текущие бета-версии MongoKitten 5 и Meow 2.0 делают это довольно легко.

Обратите внимание, что мы еще не написали документацию для этих двух библиотек, так как сначала мы перешли к стабильному API. Следующий код примерно то, что вам нужно с MongoKitten 5:

// Register MongoKitten to Vapor's Services
services.register(Future<MongoKitten.Database>.self) { container in
    return try MongoKitten.Database.connect(settings: ConnectionSettings("mongodb://localhost/my-db"), on: container.eventLoop)
}

// Globally, add this so that the above code can register MongoKitten to Vapor's Services
extension Future: Service where T == MongoKitten.Database {}

// An adaptation of your function
func bulkAddCountries(req: Request, countries:[Country]) throws ->  Future<Response> {
    // Get a handle to MongoDB
    let database = req.make(Future<MongoKitten.Database>.self)

    // Make a `Document` for each Country
    let documents = try countries.map { country in
        return try BSONEncoder().encode(country)
    }

    // Insert the countries to the "countries" MongoDB collection
    return database["countries"].insert(documents: documents).map { success in
        return // Return a successful response
    }
}
...