MongoDBでIDカラムからデータを取得するにはインスタンスに変換しないといけない

idを取得

ObjectIdオブジェクトでデータベースにあたる

var mongo = require('mongoDB');
var id = new mongo.ObjectID( id_string );

とりあえず一番始めに肝となる部分に追求しておこうと思いまして。

MongoDBは、データ挿入時に各データ行に自動的にidが振り分けられます。そしてそれは文字列ではなく、ObjectIDというオブジェクトです。

そのため、与えられたidを使ってデータを取得する場合、オブジェクトに変換する必要があります。

Node.jsとMongoDB

それにしてもいまさら感。いつも何周か遅れてやってくる私です。そろそろネタ切れなのか(爆)。

【参考】MongoDB Documentation

Node.jsからMongoDBを扱うときは、MongoDB Node.js Driverを使います。

【参考】MongoDB Node.js Driver(2.2) Documentation

MongoDBの特徴

サーバー

MongoDBの一番の特徴は、データ型にあまり縛られないところです。MySQLなどでは定義した形式でデータが送られてこないとデータベースへの挿入ができませんが、MongoDBの場合はそこをあまり気にしなくてすみます。ですが、個人的にはこの柔軟さが逆に使いづらい気がしています。

idは勝手に割り振られる

MongoDBへデータが挿入されると、自動的に_id」という名前のカラムが作成され、自動的に値が挿入されます。先程も述べましたが、この値は、文字列ではなく、オブジェクトとなります。

表示はそのまま、探すときはオブジェクトに

「ちゃんとドキュメントを読め」と、言われればそれまでなのですが、ここで私ハマりました。

Node.jsでMongoDBからデータを取ってきて、表示させるときはそのまま使えます。

<!-- View -->
<!-- テンプレートエンジンはECTを使用 -->
<p>
  <!-- そのままIDとして与えられた文字列が表示される -->
  <a href="<%- @row._id %>"><%= @row._id %></a>
</p>

そのため、findする時もIDをそのままデータベースに渡せば、対応するデータを取得できると思ってたのですが、実際はそうではありませんでした。

MongoDBのObjectIDオブジェクトのインスタントを渡さないといけないのです。

var mongoDB = require( 'mongodb' );
var mongo = mongoDB.MongoClient;

mongo.connect( 'mongo_db_host', function( err, db ){
  db.collection( '', function( err, col ){

    // 受け取ったid文字列をObjectIDオブジェクトのインスタンス化
    var id = new mongoDB.ObjectID( 'id_sring' );

    // インスタンスを使って_idカラムを検索
    col.findOne( { _id: id }, function( err, row ){
      db.close();

      // rowにidが一致したデータが格納されている
      // 得たデータを使った処理

    } );
  } );
} );

ちなみにNode.js + Express + MongoDBってな感じで使ってました。以上です。

(Visited 395 times, 1 visits today)