1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

airbnbのデータをMongoDBにインポートし、検索データをBrowserで表示する

Posted at

概要

airbnbが公開しているデータをMongoDBにインポートして、そのデータをmongoシェルで検索します。その結果をBrowserを使って表示します。

実行環境

  • Windows 10
  • MongoDB 4.0.9

airbnbデータのダウンロード

今回は上記URLからシドニー(Sydney)の2019/3/7分のデータ

  • listings.csv.gz
  • reviews.csv.gz

をダウンロードします。東京(Tokyo)はエラーとなりダウンロードできませんでした。

MongoDBにインポート

ダウンロードしたデータを解凍して、mongoimportツールを使ってインポートします。

ファイル名 データベース名 コレクション名
listings.csv test listings
reviews.csv test reviews

CSVデータのインポート

mongoimport -d test -c listings --type csv --headerline listings.csv
mongoimport -d test -c reviews --type csv --headerline reviews.csv

reviewsから日本語のコメントを検索して、listingsからデータを付加します

  • reviewsのcommentsで日本語の判定にはひらがなのてにをはが入っているもとします。
    • comments:/[て|に|を|は]/ は正規表現で、てにをはのいずれかが含まれていれば対象になります。
    • その他のひらがなや良かった,おすすめなどを含めてもOKです。漢字を使うと中国語も対象になってしまいます。
  • listingsから付加するフィールド
    • listing_url
    • price
    • latitude (緯度)
    • longitude (経度)

検索する前にlistingsにインデックスを作成します。

db.listings.createIndex({id:1})

次のJavascriptをfind.jsとして作成します

find.js
var docs=[]
db.reviews.find({comments:/[て|に|を|は]/}).forEach(doc=>{
   listing = db.listings.findOne({id:doc.listing_id})
   if (listing == null) return;
   data = {id:doc.listing_id, price:listing.price, url:listing.listing_url}
   data.latitude = listing.latitude
   data.longitude = listing.longitude
   data.comments = doc.comments
   docs.push(data)
})
print("var airbnbdata =")
printjson(docs)

print("var aribnbdata=")はJavascriptの変数として定義するためです。 _idはデータに含めないようにします。_idObjectId()の関数で表されますが、BrowserのJavascriptでは定義されていないためエラーになるからです。そのほかにはISODateNumberLongなどがエラーになります。自分で関数を定義すればエラーになりません。

上記のJavascriptをmongoシェルを使って実行します。

mongo --quiet find.js

エラーが無いことを確認したら、実行結果をcomments.jsとして保存します。

mongo --quiet find.js  > comments.js

検索データをBrowserで表示する

次のhtmlファイルをairbnb.htmlとして作成し、ローカルファイルとしてBrowserで表示させます。

comments.jsを先に記述してください。listingsの緯度経度を使ってGoogleMapで表示するようにしています。GoogleMapの表示にはhttp://www.shurey.com/html/googlemaps.html を参考にしました。囲みのCSSはhttps://saruwakakun.com/html-css/reference/box を参考にしました。

airbnb.html
<html>
<head>
    <meta charset="UTF-8">
    <style type="text/css">
        .innerbox {
            width: 600px;
            padding: 0.5em 1em;
            margin: 2em 0;
            border: solid 2px #6091d3;
            white-space: pre-wrap;
        }

        .outerbox {
            width: 640px;
            padding: 0.5em 1em;
            margin: 2em 0;
            border: double 5px #4ec4d3
        }
    </style>
</head>
<body>
    <div id="airbnb" align="center"></div>
    <script src="comments.js"></script>
    <script>
        let htmldata = []
        airbnbdata.forEach(doc => {
            htmldata.push(`<div class="outerbox" align="left">
            <p>${doc.id}<br>price:${doc.price}</p><a href="${doc.url}" target="_blank">${doc.url}</a><br>
            <a href="http://maps.google.co.jp/maps?q=loc:${doc.latitude},${doc.longitude}&iwloc=J" target="_blank">
            google map</a><pre class="innerbox">${doc.comments}</pre></div>`)
        })
        document.getElementById("airbnb").innerHTML = htmldata.join('\n')
    </script>
</body>
</html>

Browserイメージ

実データではありません。
sample.png

参照URL

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?