ページ

ラベル mongoDB の投稿を表示しています。 すべての投稿を表示
ラベル mongoDB の投稿を表示しています。 すべての投稿を表示

2012年3月11日日曜日

MongoDBのコレクションからランダムなドキュメントを取り出す

色々間違ってそうで不安だ。

http://eric.lubow.org/2010/databases/mongodb/getting-a-random-record-from-a-mongodb-collection/
ググるとこういうやり方が出て来るのだけど、実際やってみるとこれではランダムにならない。

上のやり方を僕の理解でなんとなく説明してみると
{id:1, random:9}
{id:2, random:2}
{id:3, random:5}
{id:4, random:1}
みたいな、あらかじめそれぞれのドキュメントがランダムな値を持ってるコレクションがあって
db.docs.findOne( { random : { $gte : rand } } )
みたいな感じでドキュメントを取り出すと、randよりも大きいrandom(先述したランダムな値)を持ってるドキュメントを一つ取り出す。

このrandってのはドキュメントを取り出そうとするたびに変わる値で、それゆえにrandよりも大きいrandomを持つドキュメントは毎回変わるということ。

問題はここから。

findOne()ってのはfind()したやつの中の1個を返して来る。
find()で返ってくるのはカーソルっていうハッシュみたいなやつらしく、 どうやら中身がid順で並んでる。

例えばrandが8のとき、8より大きいrandomを持つのはid:1のドキュメントだけなのでそれが取り出される。これはいい。
次に、randが3のとき、この場合はid:1とid:3が該当する。

この2つ
{:id1, random:9}
{:id3, random:5}

このとき出てきて欲しいのは、3より大きいrandomの中では一番小さい5を持つドキュメント。
でも、実際取り出されるのは並んでるのの1個目なのでid:1のドキュメント。

つまり、idが若くてrandomの値が大きいやつに偏って取り出されてしまう。

どうしたものかと考えていたらこんな解決法があった。
http://cookbook.mongodb.org/patterns/random-attribute/#comment-452243980

地理空間のインデックスを利用して、randから"一番近い"randomを持ってるやつを検索取得するようにしてる。


最初にrandomフィールドに地理空間のインデックスを作成しておく。
db.docs.ensureIndex( { random: '2d' } )

そのあとの流れは上のと大体同じ。
// それぞれのX軸の値をランダムにする
for ( i = 0; i < 10; ++i ) db.docs.insert( { key: i, random: [Math.random(), 0] } );

// $nearを使うことでランダムな値に近いやつを取れる
db.docs.findOne( {random : { $near : [Math.random(), 0] } } ) 

// 任意の個数取り出すこともできる
db.docs.find( { random : { $near : [Math.random(), 0] } } ).limit( 4 ) 


あと、そんなに早くなくてもいいからとりあえず1個取り出したいようなときはこれだけでもいける。

参考: http://stackoverflow.com/questions/2824157/random-record-from-mongodb/2824166#2824166

2011年12月25日日曜日

aptitudeでMongoDB2系をインストール

% sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10

/etc/apt/source.list に以下を追加
deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen

して
% sudo aptitude update
すればリポジトリが追加されてる。

念のために、
% sudo aptitude purge mongodb
してから
% sudo aptitude install mongodb-10gen
した。
% mongo
で動いてることを確認。2.0.2が入ってた。

参考:
Action*3 - Ubuntu 11.04にMongoDB 2.0をインストール
Ubuntu and Debian packages - MongoDB

2011年3月27日日曜日

【Ubuntu】daemontoolsのログを取る & mongoDB動いた

謝辞
 shokaiさんに捧ぐ

% sudo mkdir /etc/service/mongod/log
% sudo mkdir /etc/service/mongod/log/main
% sudo chown zakuni /etc/service/mongod/log/main


そしてrunスクリプトを書く
/etc/service/mongod/log/run
#!/bin/sh
exec 2>&1
exec setuidgid sho multilog t ./main

そしてログを確認。
/etc/service/mongod/log/main/current
があるはずなのだが、ない。

ログを取ろうとしたのにログが機能していない。

ここでふと
% ls -l /etc/service/mongod/log/

そして気付く。runに実行権がない。

実行権与える
% chmod 755 /etc/service/mongod/log/run

/etc/service/mongod/log/main/current 出来た。

catで中を見る。何も無い。
果てしない間違い探し始まる。

ここでふと
% ls -l /etc/service/mongod/

そして気付く。runに実行権がない。


shokaiさんに罵られる


実行権与える
% chmod 755 /etc/service/mongod/run

動いたあああああ

【Ubuntu】daemontoolsをインストールしてmongoDBを動かす

なんか疲れたのでとりあえずやったところまで

参考:

svtoolsとdaemontoolsをインストール

% sudo apt-get install svtools daemontools-run

続いてmongod.confを作成
% mkdir /var/mongod
% chmod 755 /var/mongod
% mkdir /usr/local/share/mongod
% emacs /usr/local/share/mongod/mongod.conf

中身は以下の通り
dbpath = /var/mongod
bind_ip = 127.0.0.1

あとrunスクリプトも

/etc/service/mongod/run
#!/bin/sh
exec 2>&1
exec setuidgid zakuni mongod --config /usr/local/share/mongod/mongod.conf

ここまでやって再起動すると動いてるはずなんです。

---こっから確認作業---

% sudo svstat /etc/service/mongod
でプロセスの状態を見られる。
% sudo svstat /etc/service/*
ってするとワイルドカードで全部見られる。

結果(1回目)
/etc/service/mongod: up (pid 1200) 0 seconds
結果(2回目)
/etc/service/mongod: up (pid 1205) 1 seconds
結果(3回目)
/etc/service/mongod: up (pid 1210) 0 seconds

0秒と1秒を行ったり来たりしてるし、プロセスIDが変わり続けてるので何か間違ってる。

3/27 1:34 追記
解決! 【Ubuntu】daemontoolsのログを取る & mongoDB動いた

2011年3月26日土曜日

【Ubuntu】mongoDB1.8をインストール

aptitudeでインストールしたやつはバージョン1.2。

1.6以上のが必要なので自分でダウンロードしてきて入れ直すことに。

aptitudeで先に入れたやつを消す。
% sudo aptitude purge mongodb

そしておもむろにwget
64bitのは動かなかったので32bitのを入れる。

% wget http://fastdl.mongodb.org/linux/mongodb-linux-i686-1.8.0.tgz
% tar zxvf mongodb-linux-i686-1.8.0.tgz
% cd mongodb-linux-i686-1.8.0/bin
% sudo cp * /usr/local/bin

データベースのディレクトリも作成
% sudo mkdir -p /data/db

mongodで起動することを確認
% sudo mongod

参考:
 [RackSpace][MongoDB][Ubuntu10.04]mongodb インストール

【Ubuntu】mongoDBをインストール

% sudo aptitude install mongodb
で済むはずが、依存パッケージ類のインストールとかがうまくいってないっぽくエラーが出た。

個別にインストールやらアップグレードしてみたけどうまくいかない。

原因は
% sudo aptitude update
を忘れてただけだった。

あらためてmongodbインストールしたら今度はいけた。

% sudo mongod

でちゃんと起動することを確認。