質問: 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
回答: > > 例えばdist:1のものを出力するようにする > > > 少々細かい指摘になっていまいますが、 まずはJavaScript世界の型に関して強くなるべきでしょう。 distはデータ型的には`数値の配列`という扱いになります。 ですので`dist:1のものを出力する`という要件を出されると、 DocumentのMatch an Arrayを使えば良いのでは?という反応になりますし、 実は他の事がしたいはずなのに日本語がおかしくて上手く説明出来ないのだろうか???と回答者側が混乱してしまいます。 > > document.dist > > document[dist] > > これらはエラーになりました。 > > > `document[dist]`のdistは変数名です。 文字列で指定するならば`document.dist`でなければなりません。 そこから先は真っ先に`console.log(document)`を叩くべきだと思います。 もしかすると`null`や`undefined`のようなキーが持てずに、 キーに対してアクセスを試みた瞬間エラーになるものもありますからね。 > > ある特定キーに対するバリューのみを出したいのですが、うまくいきません。 > > > 例題にある`[{}, {}, ... {}]`のデータ構造は`オブジェクトの配列`と呼びます。 オブジェクトの配列、つまり配列なので配列が所持しているメソッドが利用できるはずです。 JavaScriptにはArray.prototype.mapが存在するので、 配列を走査して特定の値の配列に変換するということが楽勝で行えます。 (Array.prototype.mapの理解が難しいようであれば、現段階ではfor文でちくちく回しても良いと思います) なので`MongoDBは検索`に注力して、 値の加工はJavaScriptで行うというアプローチで十分です。 ちょっとMongoDBからdataという引数で値を取り出した想定で、 distの配列だけを抜き出してみましょうか。 ``` const data = [ { id: 123, dist: [457, 442, 583], rot: [0.01, 0.14, 0.28] }, { id: 234, dist: [547, 424, 853], rot: [0.11, 0.24, 0.38] } ]; const results = data.map(obj => obj.dist); console.log(JSON.stringify(results, null, 2)); ``` ``` [ [ 457, 442, 583 ], [ 547, 424, 853 ] ] ``` できました。 `obj => obj.dist`というのはアロー関数と呼ばれる書き方です。 このように即興で関数を作れるので`Array.prototype.map`等のようなメソッドの使い勝手は非常に良くなっています。 より高度な値の加工もおまけで追記します。 例では検索結果からdistの結果を取り出して二次元配列にしましたが、 更にこれを潰して1次元配列を取り出したいという要望になると困難です。 なのでLodash のような値を加工するライブラリを導入してみるのも良いと思います。 例えばLodashにはflattenという二次元配列を潰して1次元配列にするような機能も存在しますので、 さっき話した**distの結果を取り出して二次元配列にてから1次元配列に潰す**という要件も瞬殺です。