ドキュメントをランダムに取り出すには「ドキュメントの件数を取得して、適当にオフセットして1件取得する」という方法でもできますが、これだとクエリーを2回発行することになります。
ArangoDB は 2d geo インデックスに対応してるようなので、これを利用してサクッと1回で取り出してみましょう。
最初に users
コレクションを作ります。
arangosh [example]> db._create('users')
次にランダムで検索するドキュメントを作ります。
作るのはこんなドキュメント。
{
name: 'name1',
rand: [0.12345, 0]
}
rand
フィールドが、今回ランダムに取り出すために利用する値になります。
0.12345
の部分は Math.random()
でランダムな値になります。
では、これをサクッと 10万件作ります。
arangosh [example]> for (var i=0;i<100000;i++) db.users.save({name:'name'+i, rand:[Math.random(),0]});
ちゃんとできたか確認します。
arangosh [example]> db.users.count()
100000
できてますね。
では、geo インデックスを張りましょう。
arangosh [example]> db.users.ensureGeoIndex('rand')
これでドキュメントの準備は完了です。
では、ランダムに取り出してみましょう。 near()
を使います。
arangosh [example]> db.users.near(Math.random(),0).limit(1).toArray()
[
{
"_id" : "user/147357647271",
"_rev" : "147357647271",
"_key" : "147357647271",
"name" : "name15436",
"rand" : [
0.7600883925333619,
0
]
}
]
やったー。
実行するたびに違うドキュメントが取り出せます。
ちなみに MongoDB の $near でも同じように取り出せます。
こちらからは以上です。
追記 2014年5月29日
中の人に教えてもらいましたが db.users.any()
ってやるだけでランダムにひとつ取り出せるようです。 ArangoDB すばらしい!