Node.js + StreamingAPIで取得したTweetをMongoDBに流し込む


前々からやってるTweet取得をMongoDBに流し込みます。
モジュールはMongooseを使います

http://mongoosejs.com/


##mongoose

![](http://i.gyazo.com/f2fc5fb15f9c3e2347ea2690c5429708.png)

Node.jsでMongoDBを使うときに使うモジュールです。MongoDB公式モジュールよりも人気があります。

## Mongooseを使ってNode.jsとMongoDBの接続サンプル

とりあえずミニマムっぽいものを書いてみます。

```
$ npm install mongoose
```


```mongoose.js
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/n0bisuke');

var Project = mongoose.model('Project', { name: String });

var project = new Project({ name: 'ligblog' });
project.save(function (err) {
  if (err) //失敗時
  console.log('保存成功');
});
```



![](http://i.gyazo.com/01610c83f7c0f34c6d6b9b5775d25c61.png)


QuickStartを参考にして
http://mongoosejs.com/docs/guide.html




```mongoose.js
var DB_NAME = 'myapp';

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/'+DB_NAME);

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {
  console.log('connection success');
});

var Schema   = mongoose.Schema;

var TwitterSchema = new Schema({
	body:  {
		text: String,
		url: String,
		image: String,
		location: {
			lat: String,
			lon: String
		}
	},
	user: {
		twitter_id: String,
		name: String,
		screen_name: String,
		description: String,
		images: String,
		location: {
			lat: String,
			lon: String
		}
	},
	create_at: { type: Date, default: Date.now }
});

mongoose.model('TwModel', TwitterSchema);
var TwModel = mongoose.model('TwModel');
var twmodel = new TwModel();

twmodel.user.name = 'n0bisuke';
twmodel.save(function (err, data) {
  if (err) return console.error(err);
  console.log(data);
});
```

実行

```
$ node mongoose.js
connection success
{ __v: 0,
  _id: 547c5e89993ef9e1cd5f7c39,
  create_at: Mon Dec 01 2014 21:26:49 GMT+0900 (JST),
  user: { name: 'n0bisuke', location: {} },
  body: { location: {} } }
```

##TwitterStreamingAPIから流し込み

例によって、サンプルを試している感じなのでファイル分けとかは無しです。苦笑

```mongoose.js
var DB_NAME = 'myapp';
var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/'+DB_NAME);

var db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function callback () {
  console.log('connection success');
});

var Schema   = mongoose.Schema;

var TwitterSchema = new Schema({
	content:  {
		text: String,
		url: String,
		image: String,
		location: {
			lat: String,
			lon: String
		}
	},
	user: {
		twitter_id: String,
		name: String,
		screen_name: String,
		description: String,
		images: String,
		location: {
			lat: String,
			lon: String
		}
	},
	create_at: { type: Date, default: Date.now }
});

mongoose.model('TwModel', TwitterSchema);

/*twitter設定*/
var twitter = require('twitter');

var twit = new twitter({
  consumer_key: 'xx',
  consumer_secret: 'xx',
  access_token_key: 'xx',
  access_token_secret: 'xx'
});

/**/

var TwModel = mongoose.model('TwModel');
var keyword = process.argv[2]; //第一引数
var option = {'track': keyword};

console.log(keyword+'を含むツイートを取得します。');

twit.stream('statuses/filter', option, function(stream) {
	stream.on('data', function (data){
		if(data.lang === 'ja'){
			
			var twmodel = new TwModel();
			twmodel.content = {
				text: data.text
			};

			twmodel.user = {
				screen_name: data.user.screen_name
			};

			twmodel.save(function (err, data) {
			  if (err) return console.error(err);
			  console.log(data);
			});

		}
  });
});

```

同じように実行してみます。tweetを取得するたびにMongoDBに流し込んでくれます。

MongoShellで確認するとちゃんと保存されています。
![](http://i.gyazo.com/b7c7ed81a1fa7823941a2c6dadbc9af4.png)