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

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

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

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

Node.js

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

Q&A

解決済

1回答

1435閲覧

(Node.js)MongoDBで特定のキーのバリューのみ出すには

aiai8976

総合スコア112

MongoDB

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

Node.js

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

0グッド

0クリップ

投稿2019/07/31 02:12

編集2019/07/31 02:20

前提・実現したいこと

Node.jsでmongoDBの検索をしています。
ある特定キーに対するバリューのみを出したいのですが、うまくいきません。
調べてみても、例えばdist:1のものを出力するようにするものはありますが、distの値そのものを出力させるものは見当たりません。
全体のドキュメントは表示できる状態ですので検索の仕方がわからないという問題だとおもいます。
MongoDBには以下のようにid、dist(配列)、rot(配列)が入っています。
これらのdist、rotの配列のみを変数に格納したいのですが、どのようにすればいいでしょうか。
分かる方がいましたら、回答お願いします。

[{ id:~~~, dist:[ 457, 442, ・・・ ], rot:[0.01, 0.14, ・・・ ] }]

該当のソースコード

const MongoClient = require('mongodb').MongoClient; const assert = require('assert'); // Connection URL const url = 'mongodb://localhost:27017'; // Database Name const dbName = 'study'; //結果 var result=new Array(); const client = new MongoClient(url,{useNewUrlParser: true}); // Use connect method to connect to the server client.connect(function(err) { assert.equal(null, err); console.log("Connected correctly to server"); const db = client.db(dbName); findDocuments(db, function() { client.close(); }); }); const findDocuments = function(db, callback) { // Get the documents collection const collection = db.collection('user'); // Find some documents collection.find({}).toArray(function(err, docs) { assert.equal(err, null); console.log("Found the following records"); for (var document of docs) { console.log("Found the following records"); //console.log(document[dist]); //console.log(document[rot]); //result=push(document.dist); //result=push(document.rot); } //console.log(docs) callback(docs); }); }

試したこと

document.dist
document[dist]
これらはエラーになりました。

補足情報(FW/ツールのバージョンなど)

mongodb:4.0.10
OS:Ubuntu

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

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

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

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

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

guest

回答1

0

ベストアンサー

例えばdist:1のものを出力するようにする

少々細かい指摘になっていまいますが、
まずはJavaScript世界の型に関して強くなるべきでしょう。
distはデータ型的には数値の配列という扱いになります。

ですのでdist:1のものを出力するという要件を出されると、
DocumentのMatch an Arrayを使えば良いのでは?という反応になりますし、
実は他の事がしたいはずなのに日本語がおかしくて上手く説明出来ないのだろうか???と回答者側が混乱してしまいます。

document.dist

document[dist]
これらはエラーになりました。

document[dist]のdistは変数名です。
文字列で指定するならばdocument.distでなければなりません。

そこから先は真っ先にconsole.log(document)を叩くべきだと思います。
もしかするとnullundefinedのようなキーが持てずに、
キーに対してアクセスを試みた瞬間エラーになるものもありますからね。

ある特定キーに対するバリューのみを出したいのですが、うまくいきません。

例題にある[{}, {}, ... {}]のデータ構造はオブジェクトの配列と呼びます。
オブジェクトの配列、つまり配列なので配列が所持しているメソッドが利用できるはずです。

JavaScriptにはArray.prototype.mapが存在するので、
配列を走査して特定の値の配列に変換するということが楽勝で行えます。
(Array.prototype.mapの理解が難しいようであれば、現段階ではfor文でちくちく回しても良いと思います)

なのでMongoDBは検索に注力して、
値の加工はJavaScriptで行うというアプローチで十分です。

ちょっとMongoDBからdataという引数で値を取り出した想定で、
distの配列だけを抜き出してみましょうか。

JavaScript

1const data = [ 2 { 3 id: 123, 4 dist: [457, 442, 583], 5 rot: [0.01, 0.14, 0.28] 6 }, 7 { 8 id: 234, 9 dist: [547, 424, 853], 10 rot: [0.11, 0.24, 0.38] 11 } 12]; 13const results = data.map(obj => obj.dist); 14console.log(JSON.stringify(results, null, 2));

JSON

1[ 2 [ 3 457, 4 442, 5 583 6 ], 7 [ 8 547, 9 424, 10 853 11 ] 12]

できました。
obj => obj.distというのはアロー関数と呼ばれる書き方です。
このように即興で関数を作れるのでArray.prototype.map等のようなメソッドの使い勝手は非常に良くなっています。


より高度な値の加工もおまけで追記します。

例では検索結果からdistの結果を取り出して二次元配列にしましたが、
更にこれを潰して1次元配列を取り出したいという要望になると困難です。

なのでLodash
のような値を加工するライブラリを導入してみるのも良いと思います。

例えばLodashにはflattenという二次元配列を潰して1次元配列にするような機能も存在しますので、
さっき話したdistの結果を取り出して二次元配列にてから1次元配列に潰すという要件も瞬殺です。

投稿2019/07/31 04:04

miyabi-sun

総合スコア21158

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

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

aiai8976

2019/08/01 01:59

長文コメントありがとうございます。 日本語がおかしな部分がありました。直しておきます。 また、console.log(document)で表示されたのが、自分が投稿している一つ目のコードなのでdocument自体は参照できていると思われます。 「MongoDBは検索に注力して、値の加工はJavaScriptで行うというアプローチ」という考え方には納得しました。 map関数、Loadashも試してみたいと思います。 ご丁寧に説明していただいてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問