tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

mongodbのREST API使うときの条件指定(where(filter)とかlimitとかcountとか)メモ

はじめに

mongodbのREST API使うメモです。
selectについてですが、where(filter)やlimitやcount取得なんかをメモっておきます

RESTの有効化とかについてはこちら
mongodbでREST APIを使ってみる - RESTを有効にする、iptables変更、使ってみる、まで

こんなメニュー

  • 通常select
  • limit指定
  • 条件指定のwhere(filter)
  • where(filter)+limit
  • ドキュメント件数取得
  • db一覧

今の状態確認

それぞれやってみる前に今のDBがこんな感じってのを確認しておきます

# mongo
MongoDB shell version: 2.4.8
connecting to: test
> show dbs
admin   (empty)
local   0.078125GB
rest_db 0.203125GB
test    0.203125GB

> show collections
system.indexes
users

> db.users.find()
{ "_id" : ObjectId("538707371a40f349f9d6825e"), "name" : "hoge", "age" : 10 }
{ "_id" : ObjectId("538707371a40f349f9d6825f"), "name" : "fuga", "age" : 99 }
{ "_id" : ObjectId("538707371a40f349f9d68260"), "name" : "piyo", "age" : 50 }
{ "_id" : ObjectId("538707371a40f349f9d68261"), "name" : "kame", "age" : 22 }
{ "_id" : ObjectId("538707371a40f349f9d68262"), "name" : "nana", "age" : 56 }
{ "_id" : ObjectId("538707381a40f349f9d68263"), "name" : "kaka", "age" : 10 }

ってことでこのデータに対してRESTしてみます

やってみる

通常select
# curl 'http://127.0.0.1:28017/rest_db/users/'
{
  "offset" : 0,
  "rows": [
    { "_id" : { "$oid" : "538705771a40f349f9d68258" }, "name" : "hoge", "age" : 10 } ,
    { "_id" : { "$oid" : "538705771a40f349f9d68259" }, "name" : "fuga", "age" : 99 } ,
    { "_id" : { "$oid" : "538705771a40f349f9d6825a" }, "name" : "piyo", "age" : 50 } ,
    { "_id" : { "$oid" : "538705771a40f349f9d6825b" }, "name" : "kame", "age" : 22 } ,
    { "_id" : { "$oid" : "538705771a40f349f9d6825c" }, "name" : "nana", "age" : 35 } ,
    { "_id" : { "$oid" : "538707381a40f349f9d68263" }, "name" : "kaka", "age" : 10 }
  ],

  "total_rows" : 6 ,
  "query" : {} ,
  "millis" : 0
}
limit指定
# curl 'http://127.0.0.1:28017/rest_db/users/?limit=2'
{
  "offset" : 0,
  "rows": [
    { "_id" : { "$oid" : "538705771a40f349f9d68258" }, "name" : "hoge", "age" : 10 } ,
    { "_id" : { "$oid" : "538705771a40f349f9d68259" }, "name" : "fuga", "age" : 99 }
  ],

  "total_rows" : 2 ,
  "query" : {} ,
  "millis" : 0
}
条件指定のwhere(filter)
※nameでfilter
# curl 'http://127.0.0.1:28017/rest_db/users/?filter_name=fuga'
{
  "offset" : 0,
  "rows": [
    { "_id" : { "$oid" : "538707371a40f349f9d6825f" }, "name" : "fuga", "age" : 99 }
  ],

  "total_rows" : 1 ,
  "query" : { "name" : "fuga" } ,
  "millis" : 0
}

※ageでfilter
# curl 'http://127.0.0.1:28017/rest_db/users/?filter_age=10'
{
  "offset" : 0,
  "rows": [
    { "_id" : { "$oid" : "538707371a40f349f9d6825e" }, "name" : "hoge", "age" : 10 } ,
    { "_id" : { "$oid" : "538707381a40f349f9d68263" }, "name" : "kaka", "age" : 10 }
  ],

  "total_rows" : 2 ,
  "query" : { "age" : 10 } ,
  "millis" : 0
}
where(filter)+limit
# curl 'http://127.0.0.1:28017/rest_db/users/?filter_age=10&limit=1'
{
  "offset" : 0,
  "rows": [
    { "_id" : { "$oid" : "538707371a40f349f9d6825e" }, "name" : "hoge", "age" : 10 }
  ],

  "total_rows" : 1 ,
  "query" : { "age" : 10 } ,
  "millis" : 0
}
ドキュメント件数取得

これは注意したいのが&limit=1がないとなぜか取得できません

※limit付き
# curl 'http://127.0.0.1:28017/rest_db/$cmd/?filter_count=users&limit=1'
{
  "offset" : 0,
  "rows": [
    { "n" : 6, "ok" : 1 }
  ],

  "total_rows" : 1 ,
  "query" : { "count" : "users" } ,
  "millis" : 0
}

※limit無し
# curl 'http://127.0.0.1:28017/rest_db/$cmd/?filter_count=users'
{
  "offset" : 0,
  "rows": [

  ],

  "total_rows" : 0 ,
  "query" : { "count" : "users" } ,
  "millis" : 102
}
db一覧

こちらもlimit指定がないと取得できないようです

# curl 'http://127.0.0.1:28017/admin/$cmd/?filter_listDatabases=1&limit=1'
{
  "offset" : 0,
  "rows": [
    { "databases" : [ { "name" : "test", "sizeOnDisk" : 218103808, "empty" : false }, { "name" : "test_db", "sizeOnDisk" : 218103808, "empty" : false }, { "name" : "rest_db", "sizeOnDisk" : 218103808, "empty" : false }, { "name" : "local", "sizeOnDisk" : 83886080, "empty" : false }, { "name" : "admin", "sizeOnDisk" : 1, "empty" : true } ], "totalSize" : 738197504, "ok" : 1 }
  ],

  "total_rows" : 1 ,
  "query" : { "listDatabases" : 1 } ,
  "millis" : 0
}

まとめ

簡単はwhere(fileter)はこんな感じでできます!
enjoy!。。。といいたいところですが、
もっと複雑なfilterについて(matchとかsumとかとか)情報があればどなたか教えてください(><)
※あまり調べられてませんが。。。汗