一括追加とあいまい検索(VaporとMongoDBで更に遊ぶ)

MongoDB

はじめに

取り組みやすいところから掘り下げ。
今回は複数ドキュメントの一括追加とあいまい検索です。

あいまい検索ができるようになったのは、私の中ではかなり大きな進歩です。

複数件のドキュメントを一気に追加したい

データの更新削除の前に、まずは昨日の宿題の一つを試してみます。気になって仕方がなかった一件。

insertManyメソッドがあるので、複数件のドキュメントを一気に追加できるはずです。問題は、JSONで渡したデータをどのように切り分けるか。req.content.decode([Book.self])とか、Book[Book]にするとできそうなのですよね。

やってみましたよ。

router.post([Book].self, at:"api/books") { (req, books) -> Future<[Book]> in
    let client = try! req.make(MongoClient.self)
    let collection = client.db("vaporapp").collection("books", withType: Book.self)
    return try req.content.decode([Book].self).map(to: [Book].self) { books in
        _ = try! collection.insertMany(books)
        return books
    }
}

できたよ:D
JSONで渡したデータの切り分け方とか、小難しいことは考える必要なかったよ。縦長の画像になってしまったけど、できたしるしを残しておきます。

JSONの配列が上手くInsertできた!

すべてを配列にするところがミソですね。

ヌッコ尽くし(ΦωΦ)

あいまい検索のこと

router.get("api/books",String.parameter) { req -> [Book] in
    let client = try! req.make(MongoClient.self)
    let collection = client.db("vaporapp").collection("books", withType: Book.self)
    let title = try req.parameters.next(String.self).lowercased()
    return try! collection.find().filter({ book -> Bool in
        return book.title.contains(title)
    })
}

これで絞り込みができるのが不思議ですが、できるんです。
trueを返すものだけをまとめて返してくれます。この場合だと、titleに指定した文字列が含まれていたらtrueが返るようにしていますので、結果的に部分一致検索が実現できています。

containsメソッドはSwiftのString型が持つ標準的なメソッドですので、この部分についてはVaporとかのことは考えず処理をしていただければOKです。大文字小文字の区別がなされることにご注意。

まとめ

やってみれば意外とできるものです。これを洗練させていきたいですね。
ひとまず動けば良いレベルから、もう一歩進めたいです。