Windows の MongoDB サービスで RECT を有効にする

Windows で MongoDB をサービスとしてインストールする場合 デフォルトでは RECT は無効になっています。

C:\> mongod --install ^
            --logpath E:\MongoDB\log\log.txt ^
            --dbpath E:\MongoDB\data

RECT を有効にするには、"--rect" オプションを指定します。

C:\> mongod --install ^
            --logpath E:\MongoDB\log\log.txt ^
            --dbpath E:\MongoDB\data ^
            --rect

すでにインストール済みの場合は "--install" オプションを "--reinstall" に変えて実行します。

これで RECT が有効になります。

WRITE_0624_01

サービスの「実行ファイルへのパス」にオプションが追加されます。

MongoDB 2.2.0 は WindowsXP サポート外

WindowsXP 環境に MongoDB 2.2.1 を入れようとしたら エラーになったメモです。

mongodb-win32-i386-2.2.1.zip をダウンロードして mongod.exe を実行したところ
『プロシージャ エントリ ポイント InterlockedCompareExchange64 がダイナミック リンク ライブラリ KERNEL32.dll から見つかりませんでした。』
という エラーメッセージが出ました。

[参考サイト]
marunouchi-mongodb/20120926/syokenz at master ・ syokenz/marunouchi-mongodb ・ GitHub

上記サイトによると、2.2.0 で WindowsXP のサポートは終了したそうです。

MongoDB 2.0.7 を入れたら動きました。

node.js から MongoDB を使ってみる

node.jsmongoose をインストールしたので node.js から MongoDB の値を取得してみます。

次のサイトを参考に進めました。

[参考]
mongooseを使ってmongodbにアクセスしてみる - A Peak Never Ending !

まず MongoDB にデータを登録します。

$ mongo
MongoDB shell version: 1.2.2
url: test
connecting to: test
type "exit" to exit
type "help" for help
> use memo
switched to db memo
> db.memos.save({title:'test title1', body:'test body1'})
> db.memos.save({title:'test title2', body:'test body2'})
> exit

データベースは memo、コレクションは memos にします。

node.js のスクリプト memo.js を作ります。
上記の参考サイトのスクリプトをそのまま貼り付けます。

$ vi memo.js
/*
 * Mongooseでデータを取り出して表示するテスト
 */
var mongoose = require('mongoose');

// スキーマ定義
var MemoSchema = new mongoose.Schema({
  title: String,
  body: String
});
// モデルとして登録
var Memo = mongoose.model('Memo', MemoSchema);

// mongodbに接続
mongoose.connect('mongodb://localhost:27017/memo',
  // memoの部分はデータベース名
  // コールバックでエラー時の処理が書けるみたい。
  function(err) {
    if (err) {
      console.log(err);
    } else {
      console.log('connection success!');
    }
  }
);

// findしてコンソールに出力
Memo.find({}, function(err, docs) {
  if(!err) {
    console.log("num of item => " + docs.length)
    for (var i = 0; i < docs.length; i++ ) {
      console.log(docs[i]);
    }
    mongoose.disconnect()  // mongodbへの接続を切断
    process.exit()         // node.js終了
  } else {
    console.log("find error")
  }
});

実行してみます。

$ node memo.js
connection success!
num of item => 2
{ _id: 4f73edfbb7c76c517dc7eb16,
  title: 'test title1',
  body: 'test body1' }
{ _id: 4f73edffb7c76c517dc7eb17,
  title: 'test title2',
  body: 'test body2' }

node.js から MongoDB の値が取得できました。
これで、できることの幅が広がりました。

Ubuntu10.04 に mongoose をインストールする

作業メモです。
前回の node.js の続きです。 今回は mongoose を入れます。

mongoose は node.js から mongodb を ORM っぽくアクセスするためのライブラリです。

mongoose のインストールには npm を使います。 npm は、前回の node.js のインストールで入っています。

$ which npm
/usr/local/bin/npm

プロキシ認証が必要な環境だとちょっと大変です。

まず npm にプロキシの設定をします。

$ npm config set proxy http://USER:PASSWORD@SERVER:PORT

プロキシを使う環境だと DNS が引けなくても大丈夫だったりしますが npm では下のサイトに書いてあるように名前の解決ができくてエラーになってしまいました。

[参考]
Proxy環境下でnpmインストール :ダメ人間オンライン

DNS を設定するか /etc/hosts に接続先の registry.npmjs.org を追加したりして対応します。

mongoose のインストール。

$ npm install mongoose

・・・と思いきや、またもやエラーが出ます。

npm http GET https://registry.npmjs.org/mongoose

npm ERR! Error: connect ECONNREFUSED
npm ERR!     at errnoException (net.js:670:11)
npm ERR!     at Object.afterConnect [as oncomplete] (net.js:661:19)

次のサイトに書いてあるように https だとうまくいきません。

[参考]
WindowsXP + プロキシ環境でnpmを使う - 四角革命前夜

ホームディレクトリに .npmrc ができているので編集します。

$ vi ~/.npmrc

プロキシの設定が書いてあるので 次の行を追加します。

registry = http://registry.npmjs.org/

もう 1 度インストール。

$ npm install mongoose

今度は成功しました。

MongoDB を使ってみる 4

今回は、実際にデータを登録して見ます。 MongoDB は、 事前にテーブルなどを作成しません。 (スキーマレスと呼ぶそうです)

データベースと言えば SQL なので 次のサイトが わかりやすくて参考になりました。

[参考]
SQL脳に優しいMongoDBクエリー入門 - あるプログラマーの後悔日誌

MongoDB の操作は JavaScript な感じです。

> db.books.insert({ name : "a" });

スキーマレスなので、 何の定義もなく いきなりこんな記述で、データを登録できてしまいます。

books の部分が『コレクション』で RDBMS だとテーブルのようなものだと思います。

そこに JSON 形式のデータを INSERT しました。

{ name : "a" }

"show collections" で コレクションの一覧を参照できます。

> show collections
books
system.indexes

さっき登録した books があります。

もう 1 件登録してみます。

> db.books.insert({ name : "b" });

コレクションの中身を見るには次のように コレクションに対して find() メソッドを使用します。

> db.books.find();
{ "_id" : ObjectId("4f5ff9e69d12fb10f7c2955f"), "name" : "a" }
{ "_id" : ObjectId("4f647e7b9d12fb10f7c29560"), "name" : "b" }

上のように暗黙的に "_id" が作成されて データが管理されます。

もう少し複雑なデータを登録してみます。

> db.books.insert({ name : "c", detail : { size : "b5", page : 120 }});
> db.books.find();
{ "_id" : ObjectId("4f5ff9e69d12fb10f7c2955f"), "name" : "a" }
{ "_id" : ObjectId("4f647e7b9d12fb10f7c29560"), "name" : "b" }
{ "_id" : ObjectId("4f6480479d12fb10f7c29561"), "name" : "c", "detail" : { "size" : "b5", "page" : 120 } }

このように MongoDB は 1 つの "_id" に対して 1 つの JSON 形式のデータ(ドキュメント)を格納する形式のようです。

Web のインターフェースを使って見てみます。

http://127.0.0.1:28017/test/books/

test の部分がデータベース名、bookes がコレクション名です。

{
  "offset" : 0,
  "rows": [
    { "_id" : { "$oid" : "4f5ff9e69d12fb10f7c2955f" }, "name" : "a" } ,
    { "_id" : { "$oid" : "4f647e7b9d12fb10f7c29560" }, "name" : "b" } ,
    { "_id" : { "$oid" : "4f6480479d12fb10f7c29561" }, "name" : "c", "detail" : { "size" : "b5", "page" : 120 } }
  ],

  "total_rows" : 3 ,
  "query" : {} ,
  "millis" : 0
}

こんなデータが返ってきました。
これなら Ajax や node.js などからも 簡単に連携できそうです。

MongoDB を使ってみる 3

今回も mongo クライアントの話です。

mongo クライアントを起動すると デフォルトでは、次のように test というデータベースに接続されます。

$ mongo
MongoDB shell version: 1.2.2
url: test
connecting to: test
type "exit" to exit
type "help" for help
>

"show dbs" で データベースの一覧を表示します。

> show dbs
admin
local
test

"use [データベース名]" で データベースを変更します。

> use local
switched to db local

DB に接続するというよりは カレントの DB を変更する、という感じですね。

MongoDB を使ってみる 2

今回は mongo クライアントを使ってみます。

Ubuntu10.04 の場合、mongodb パッケージをインストールすると mongo クライアントも入ります。

起動します。

$ mongo
MongoDB shell version: 1.2.2
url: test
connecting to: test
type "exit" to exit
type "help" for help
>

出力されている通り help 表示してみます。

> help
HELP
  show dbs                 show database names
  show collections         show collections in current database
  show users               show users in current database
  show profile             show most recent system.profile entries with time >= 1ms 
  use <db name>            set curent database to <db name>
  db.help()                help on DB methods
  db.foo.help()            help on collection methods
  db.foo.find()            list objects in collection foo
  db.foo.find( { a : 1 } ) list objects in foo where a == 1
  it                       result of the last line evaluated; use to further iterate 

なんか色々と出ました。

exit で終了します。

> exit
bye
$

たぶん続きます。

MongoDB を使ってみる 1

ドキュメント指向とやらの MongoDB を使ってみます。

まずはインストール。
環境はいつもの Ubuntu10.04 です。

$ sudo apt-get install mongodb

パッケージがあるので apt-get します。
ただ、↓のような感じで結構色々必要なようでした。

4 upgraded, 140 newly installed, 0 to remove and 121 not upgraded.
Need to get 66.1MB of archives.
After this operation, 258MB of additional disk space will be used.

インストールが完了すると、すでに起動しています。

$ ps ax | grep mongo
28350 ? Ssl 0:00 /usr/lib/mongodb/mongod --config /etc/mongodb.conf

起動の引数になっていた設定ファイルは以下のようでした。

$ cat cat /etc/mongodb.conf
# This is an config file for MongoDB master daemon mongod
# it is passed to mongod as --config parameter

logpath = /var/log/mongodb/mongod.log
dbpath = /var/lib/mongodb/

# use 'true' for options that don't take an argument
logappend = true
bind_ip = 127.0.0.1
#noauth = true

LISTEN ポートは 27017 と 28017 が追加されてました。

$ netstat -ant
tcp  0  0 127.0.0.1:27017  0.0.0.0:*  LISTEN  -
tcp  0  0 127.0.0.1:28017  0.0.0.0:*  LISTEN  -

27017 が DB 接続用のポート(デフォルト)で、 それに +1000 した 28017 は管理用の Web ページのようです。

http://127.0.0.1:28017/

これにアクセスすると下の参考サイトような感じで 色々とデータベースの情報が見れるようです。

[参考]
HTTPインターフェース - Docs-Japanese - 10gen Confluence

また、データベースやクエリーを URL に設定してアクセスすると データを text/plain の JSON 形式で出力してくれるので Web サービスとしても簡単に利用できそうな気がします。