はじめに
取り組みやすいところから掘り下げ。
今回は複数ドキュメントの一括追加とあいまい検索です。
あいまい検索ができるようになったのは、私の中ではかなり大きな進歩です。
複数件のドキュメントを一気に追加したい
データの更新削除の前に、まずは昨日の宿題の一つを試してみます。気になって仕方がなかった一件。
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で渡したデータの切り分け方とか、小難しいことは考える必要なかったよ。縦長の画像になってしまったけど、できたしるしを残しておきます。
すべてを配列にするところがミソですね。
ヌッコ尽くし(ΦωΦ)
あいまい検索のこと
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です。大文字小文字の区別がなされることにご注意。
まとめ
やってみれば意外とできるものです。これを洗練させていきたいですね。
ひとまず動けば良いレベルから、もう一歩進めたいです。