node.js/mongoose を使って、Windows 環境で mongodb に接続する。

相変わらず

Windows には npm が無いので、地道にインストールしていきましょう。

その前に MongoDB のインストール

http://www.mongodb.org/
本家サイトから、環境にあったものをダウンロードします。

今回は、1.8.3 の 32bit 版を使用します。

インストール

ダウンロードしてきた zip を展開するだけです。

mongoose のインストール

ダウンロード

https://github.com/LearnBoost/mongoose
バージョンは 2.0.4 をインストール

配置

node.exe と同じ場所に mongoose にリネームして配置。以下のような感じです。

/
+ node.exe
+ mongoose
  + lib/
  + index.js
  + package.json
  + ...
今回は

mongoose から mongodb にアクセスできる事を目標とします。

依存関係の確認

package.json を見ると以下の3つのようですね。

  1. hooks 0.1.9
  2. mongodb 0.9.6-7
  3. colors 0.5.0

hooks-js のインストール

ダウンロード

https://github.com/bnoguchi/hooks-js
※これ相当探すのに困りました。。

配置

hooks にリネーム後、同じように配置します。

node-mongodb-native のインストール

mongodb でインストールされるのは、これのようです。

ダウンロード

https://github.com/christkv/node-mongodb-native
0.9.6.7 をダウンロード

配置

mongodb にリネーム後、同じように配置します。

colors.js のインストール

おそらくこれはインストールしなくても動きます。

配置

colors にリネーム後、同じように配置します。

全て配置後

/
+ node.exe
+ mongoose
+ hooks
+ mongodb
+ colors

mongodb 側の接続準備

db ディレクトリを作成

適当な場所に実データを保存する領域を作ります。
今回は以下の場所に配置

mongodb/
  + 1.8.6/
    + bin/
       + mongod.exe
       + mongo.exe
       + ...
  + db/
mongod を起動
> mongod.exe --dbpath=..\..\db
接続確認

mongo.exe を起動して接続してみます。

> mongo.exe
MongoDB shell version: 1.8.3
connecting to: test
> show dbs
admin   (empty)
local   (empty)

接続できましたね!

まずは node-mongodb-native のみで接続してみる

mongoose は ORM なので、普通に mongodb を扱うだけなら node-mongodb-native で十分です。(というか内部ではこちらを使ってるので)

接続テストコード

mongodb-native-sample.js で以下を保存します。

var mongo = require('mongodb'),
  Server = mongo.Server,
  Db = mongo.Db;

var server = new Server('localhost', 27017, {});
var db = new Db('test', server, {native_parser:false});

db.open(function(err, db) {
  if(!err) {
    console.log("connected");
  } else {
    console.log(err);
  }
});
テストの実行
> node mongodb-native-sample.js

応答がありません。。。

何が問題か?

現状の私の能力では状況の切り分けが難しかったので、愚直ですが mongodb-native のバージョンを変えていきました。
その結果、0.9.3 で接続させる事ができました。

0.9.3 で再度テスト実行
> node mongodb-native-sample.js
connected

接続できましたね。
うーん、mac でやってた時は勝手に依存関係解決してくれてましたが、実は 0.9.3 が選ばれてたのかな。

テスト後の DB の様子
> mongo.exe
...
> show dbs
admin   (empty)
local   (empty)
test    0,03125GB

test と名前のついた db が作成されましたね。
mongodb は存在しない db やコレクションにアクセスした際にはその時に作成します。

mongoose で接続してみる

さて、やっと mongoose での接続です。

データ投入

samples というコレクションを作成し、そこに description のみを持ったドキュメントを追加していきます。

> mongo.exe
...
> use test // test に db をスイッチ
switched to db test
> db.samples.insert({description:'one'})
> db.samples.insert({description:'two'})
> db.samples.insert({description:'three'})
> show collections
samples
system.indexes
> db.samples.find({})
{ "_id" : ObjectId("4e66d2c64db1979c7c1681f5"), "description" : "one" }
{ "_id" : ObjectId("4e66d2ce4db1979c7c1681f6"), "description" : "two" }
{ "_id" : ObjectId("4e66d2d44db1979c7c1681f7"), "description" : "three" }
>
接続テストコード

以下を mongoose-sample.js として保存します。
上記で投入したドキュメントを取得するために、同名かつ末尾の「s」を除外したスキーマを作成します。
この辺りは mongoose 関連の記事を見てください。
接続先は test db です。

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var db = mongoose.connect('mongodb://localhost/test');

var SampleSchema = new Schema({
  description: String
});

mongoose.model('Sample', SampleSchema );
var Sample= mongoose.model('Sample');

Sample.find(function(err, docs) {
  console.log(docs.length);
  for (var i = 0, size = docs.length; i < size; ++i) {
    console.log(docs[i].description);
  }
});
テスト実行
> node mongoose-sample.js
3
one
two
three

値を取得できましたね!

バージョンで若干手間取りましたがなんとか接続することができました。。
やはりこのあたりも自動で解決されるようになって欲しいですね。。