質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

368閲覧

node.jsで、外部APIへアクセスし、mongodb内のデータと比較する方法

退会済みユーザー

退会済みユーザー

総合スコア0

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2019/01/06 07:10

■やりたいこと
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.10twitter@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});

他に必要な情報がありましたら、ご指摘ください。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

javascript

1const main = async () => { 2 3 const client = await mongodb.MongoClient.connect(HOSTNAME, { useNewUrlParser: true }) 4 const db = await client.db(DB_NAME) 5 6 try { 7 const docs = await db.collection(COLLECTION_NAME).find({}).toArray() 8 const tweets = await client_tw.get('search/tweets', params) 9 10 for (var i = 0; i < tweets.statuses.length; i++) { 11 for (var doc of docs) { 12 if (tweets.statuses[i].id === doc.id) { 13 break; 14 } 15 } 16 console.log(tweets.statuses[i].id); 17 } 18 } catch(err) { 19 throw err; 20 } 21 22 await client.close(); 23} 24 25main();

投稿2019/01/06 10:20

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問