■やりたいこと
TwitterのTLデータが格納されているMongoDBに、新たにTwitterのTLデータを格納する前に、
既存のデータとTwitterの REST APIから取得したデータの{id}を比較し、一致しないデータだけ格納したい。
■できていないこと
比較する際に、APIから取得したツイートとMongoDBからfindした内容が比較できない。(undefindになってしまう。)
■わからないこと
Javascriptの仕様である非同期を理解しきれていない所為で、思うように「やりたいこと」を実現できていません。
MongoDBから取得したカーソルをtoArray()で回す際にコールバック関数を使用するのですが、こちらにTwitter APIで取得したデータの渡し方がわからない。
toArrayのコールバック関数にtweetsを渡してもうまくいかない。
■教えていただきたいこと
Node.jsで、Twitterなどの外部APIからデータを取得しつつ、すでに格納されているMongoDBのデータと比較する方法。
■環境
OS: CentOS Linux release 7.6.1810 (Core)
Node.js: v8.15.0
ライブラリ:mongodb@3.1.10、twitter@1.7.1
MongoDB: v3.4.10
javascript
1'use strict'; 2const MongoClient = require('mongodb').MongoClient 3const assert = require('assert') 4 5const Twitter = require('twitter') 6 7const HOSTNAME = 'mongodb://127.0.0.1:27017' 8const DB_NAME = 'company' 9const COLLECTION_NAME = 'members' 10 11const client_tw = new Twitter({ 12 consumer_key: '', 13 consumer_secret: '', 14 access_token_key: '', 15 access_token_secret: '', 16}); 17 18client_tw.get('search/tweets', function(error, tweets, response) { 19 MongoClient.connect(HOSTNAME, { useNewUrlParser: true }, (err, client) => { 20 const db = client.db(DB_NAME) 21 const collection = db.collection(COLLECTION_NAME) 22 23 for (var i = 0; i < tweets.statuses.length; i++) { 24 collection.find().toArray(function(err, docs) { 25 assert.equal(err, null) 26 for (var doc of docs) { 27 if (tweets.statuses[i].id !== doc.id) { //ここでツイートと比較 28 console.log(doc.id); //デバッグのためにコンソール出力にしていますが、実際にはinsertしたい 29 } 30 } 31 }); 32 } 33 34 }); 35});
他に必要な情報がありましたら、ご指摘ください。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。