2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ArangoDB でランダムにドキュメントを1つ取り出す方法

Last updated at Posted at 2014-05-29

ドキュメントをランダムに取り出すには「ドキュメントの件数を取得して、適当にオフセットして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 すばらしい!

2
2
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?