{"id":23701091,"url":"https://github.com/ehanlin/mongodb-dbobject-embedder","last_synced_at":"2026-01-29T09:30:16.256Z","repository":{"id":32283678,"uuid":"35858459","full_name":"eHanlin/mongodb-dbobject-embedder","owner":"eHanlin","description":"Lets you use string easily embed other collection's DBObject","archived":false,"fork":false,"pushed_at":"2015-12-31T07:39:30.000Z","size":108,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":12,"default_branch":"master","last_synced_at":"2024-12-28T19:03:34.801Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eHanlin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2015-05-19T04:04:19.000Z","updated_at":"2015-06-11T06:43:53.000Z","dependencies_parsed_at":"2022-09-12T03:50:51.557Z","dependency_job_id":null,"html_url":"https://github.com/eHanlin/mongodb-dbobject-embedder","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eHanlin%2Fmongodb-dbobject-embedder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eHanlin%2Fmongodb-dbobject-embedder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eHanlin%2Fmongodb-dbobject-embedder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eHanlin%2Fmongodb-dbobject-embedder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eHanlin","download_url":"https://codeload.github.com/eHanlin/mongodb-dbobject-embedder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239776572,"owners_count":19695128,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-30T09:31:54.276Z","updated_at":"2026-01-29T09:30:16.222Z","avatar_url":"https://github.com/eHanlin.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# mongodb-dbobject-embedder\n\u003e使用簡易的語法進行 mongodb 的資料查詢及再處理\n\n## 簡易範例\n\n#### Example 1\n\u003e執行 db.user.find({ height : { $gte : 215 } }) 的原始資料\n\n```javascript\n[\n  { \n    \"_id\" : ObjectId(\"557e58727a8ea2a9dfe2ef76\"), \n    \"name\" : \"Kirk\", \n    \"postal_code\" : ObjectId(\"557e56287a8ea2a9dfe2ef71\"), \n    \"height\" : 220, \n    \"friends\" : [ \n      ObjectId(\"557e58727a8ea2a9dfe2ef74\"), \n      ObjectId(\"557e58727a8ea2a9dfe2ef77\"), \n      ObjectId(\"557e58727a8ea2a9dfe2ef7a\"), \n      ObjectId(\"557e58727a8ea2a9dfe2ef7e\")] \n  },\n  { \n    \"_id\" : ObjectId(\"557e58727a8ea2a9dfe2ef7a\"), \n    \"name\" : \"Rick\", \n    \"postal_code\" : ObjectId(\"557e56287a8ea2a9dfe2ef72\"), \n    \"height\" : 218, \n    \"friends\" : [ \n      ObjectId(\"557e58727a8ea2a9dfe2ef76\"), \n      ObjectId(\"557e58727a8ea2a9dfe2ef7c\"), \n      ObjectId(\"557e58727a8ea2a9dfe2ef7e\")] \n  }\n]\n```\n\n\u003e下面的 DSL 將會把 user 這個 collection 中身高大於 215 的使用者撈出，\n\u003e加入一個新欄位 num，值是同一個 postal_code 中身高大於 200 的使用者數，\n\u003e並且將其原本以 ObjectId 記錄的 postal_code 資料嵌入，\n\u003e再將 friends 中的 postal_code 嵌入。\n\n```\n@find \u003cdb=user coll=user query={ height : { $gte : 215 } }\u003e\n[\n  @count (db=user coll=user query={ height : { $gte : 200 } , postal_code : @.postal_code })\n  num\n\n  @findOneById \u003cdb=info coll=postal_code projection={ _id : 0 , name : 1 }\u003e\n  postal_code\n\n  @findOneById [db=user coll=user, projection={ _id : 0 , postal_code : 1, height : 1}]\n  friends\n  [\n    @findOneById \u003cdb=info coll=postal_code projection={ _id : 0 , name : 1 }\u003e\n    postal_code\n  ]\n]\n```\n\n\u003e執行 DSL 之後的結果\n\n```javascript\n[\n  {\n    \"_id\":{\"$oid\":\"557e58727a8ea2a9dfe2ef76\"},\n    \"name\":\"Kirk\",\n    \"postal_code\":{\"name\":\"中正區\"},\n    \"height\":220,\n    \"friends\":[\n      {\"postal_code\":{\"name\":\"中正區\"},\"height\":201},\n      {\"postal_code\":{\"name\":\"中正區\"},\"height\":211},\n      {\"postal_code\":{\"name\":\"信義區\"},\"height\":218},\n      {\"postal_code\":{\"name\":\"內湖區\"},\"height\":208}],\n    \"num\":3\n  },\n  {\n    \"_id\":{\"$oid\":\"557e58727a8ea2a9dfe2ef7a\"},\n    \"name\":\"Rick\",\n    \"postal_code\":{\"name\":\"信義區\"},\n    \"height\":218,\n    \"friends\":[\n      {\"postal_code\":{\"name\":\"中正區\"},\"height\":220},\n      {\"postal_code\":{\"name\":\"信義區\"},\"height\":214},\n      {\"postal_code\":{\"name\":\"內湖區\"},\"height\":208}],\n    \"num\":4\n  }\n]\n```\n\n## Repository\n\u003e Maven\n\n```\n\u003crepositories\u003e\n  \u003crepository\u003e\n    \u003cid\u003emongodb-dbobject-embedder\u003c/id\u003e\n    \u003curl\u003ehttp://dl.bintray.com/hotdog929/maven\u003c/url\u003e\n  \u003c/repository\u003e\n\u003c/repositories\u003e\n\u003cdependencies\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003etw.com.ehanlin\u003c/groupId\u003e\n    \u003cartifactId\u003emongodb-dbobject-embedder\u003c/artifactId\u003e\n    \u003cversion\u003e0.0.10\u003c/version\u003e\n  \u003c/dependency\u003e\n\u003c/dependencies\u003e\n```\n\n\u003e Sbt\n\n```\nresolvers += \"mongodb-dbobject-embedder\" at \"http://dl.bintray.com/hotdog929/maven\"\nlibraryDependencies ++= Seq(\n  \"tw.com.ehanlin\" % \"mongodb-dbobject-embedder\" % \"0.0.10\"\n)\n```\n\n\u003e Gradle\n\n```\nrepositories {\n    maven {\n        url \"http://dl.bintray.com/hotdog929/maven\"\n    }\n}\ndependencies {\n    compile 'tw.com.ehanlin:mongodb-dbobject-embedder:0.0.10'\n}\n```\n\n\u003e Grape\n\n```\n@GrabResolver(name='mongodb-dbobject-embedder', root='http://dl.bintray.com/hotdog929/maven')\n@Grab('tw.com.ehanlin:mongodb-dbobject-embedder:0.0.10')\n```\n\n## 使用方式\n\n```java\n\nMongo mongo = new Mongo(host, port)\n\n//設定 default db\nMongoEmbedder.registerDB(mongo.getDB(\"info\"))\n\n//設定各 db\nMongoEmbedder.registerDB(\"info\", mongo.getDB(\"info\"))\nMongoEmbedder.registerDB(\"user\", mongo.getDB(\"user\"))\n\n//執行 DSL\nMongoEmbedder.instance.embed(null, \"@find \u003cdb=user coll=user query={ height : { $gte : 215 } }\u003e [ ]\")\n\n```\n\n\n## 語法說明\n\n### 屬性的迭代作用域\n\u003e可以用在屬性上的作用城有二種\n* \u003c content... \u003e 會將傳入的值當一個單一值處理\n* [ content... ] 會將傳入的值當集合處理，依傳入值的類型，會有以下三種情況：\n  * List ： for(v in List){List[index] = embed(v)} return List\n  * Map ： for(k,v in Map){Map[k] = embed(v)} return Map\n  * Other ： return [ embed(Other) ] as List\n* 巢狀迭代是合法的，比如 [[ content... ]] 對應到巢狀 List 時的執行方式是 for(v in List){List[index] = for(vv in v){embed(vv)}} return List\n\n#### Example 2  \u003c content... \u003e\n\u003e執行 db.user.findOne({ _id : ObjectId(\"557e58727a8ea2a9dfe2ef7a\") }) 的原始資料\n\n```javascript\n{ \n  \"_id\" : ObjectId(\"557e58727a8ea2a9dfe2ef7a\"), \n  \"name\" : \"Rick\", \n  \"postal_code\" : ObjectId(\"557e56287a8ea2a9dfe2ef72\"), \n  \"height\" : 218, \n  \"friends\" : [ \n    ObjectId(\"557e58727a8ea2a9dfe2ef76\"), \n    ObjectId(\"557e58727a8ea2a9dfe2ef7c\"), \n    ObjectId(\"557e58727a8ea2a9dfe2ef7e\")] \n}\n```\n\n\u003eDSL\n\n```\n@findOne \u003cdb=user coll=user query={ _id : { $oid : \"557e58727a8ea2a9dfe2ef7a\" } }\u003e\n\u003c\n  @findOneById \u003cdb=info coll=postal_code projection={ _id : 0 }\u003e\n  postal_code\n  \u003c\n    @findOne \u003cdb=info coll=city query={ _id : { $oid : @ } } projection={ _id : 0 }\u003e\n    city\n    \u003c\n      @findOneById \u003cdb=info coll=country projection={ _id : 0 }\u003e\n      country\n    \u003e\n  \u003e\n\u003e\n```\n\n\u003e執行 DSL 之後的結果\n\n```javascript\n{\n  \"_id\":{\"$oid\":\"557e58727a8ea2a9dfe2ef7a\"},\n  \"name\":\"Rick\",\n  \"postal_code\":{\n    \"country\":\"TW\",\n    \"city\":{\n      \"country\":{\n        \"name\":\"臺灣\"},\n      \"name\":\"臺北市\"},\n    \"code\":\"110\",\n    \"name\":\"信義區\"},\n  \"height\":218,\n  \"friends\":[\n    {\"$oid\":\"557e58727a8ea2a9dfe2ef76\"},\n    {\"$oid\":\"557e58727a8ea2a9dfe2ef7c\"},\n    {\"$oid\":\"557e58727a8ea2a9dfe2ef7e\"}]\n}\n```\n\n#### Example 3  [ content... ] Map\n\u003e執行 db.team.find({ _id : \"zebra\" }) 的原始資料\n\n```javascript\n{\n  \"_id\" : \"zebra\",\n  \"name\" : \"zebra\",\n  \"player\" : {\n    \"c\" : ObjectId(\"557e58727a8ea2a9dfe2ef76\"),\n    \"f\" : ObjectId(\"557e58727a8ea2a9dfe2ef77\"),\n    \"g\" : ObjectId(\"557e58727a8ea2a9dfe2ef7b\")}\n}\n```\n\n\u003eDSL\n\n```\n@findOne \u003cdb=user coll=team query={ _id : \"zebra\" } projection={ _id : 0 }\u003e\n\u003c\n  @findOneById [db=user coll=user projection={ _id : 0 , name : 1 , postal_code : 1 }]\n  player\n  [\n    @findOneById \u003cdb=info coll=postal_code projection={ _id : 0 , name : 1 }\u003e\n    postal_code\n  ]\n\u003e\n```\n\n\u003e執行 DSL 之後的結果\n\n```javascript\n{\n  \"name\":\"zebra\",\n  \"player\":{\n    \"c\":{\n      \"name\":\"Kirk\",\n      \"postal_code\":{\"name\":\"中正區\"}},\n    \"f\":{\n      \"name\":\"Mick\",\n      \"postal_code\":{\"name\":\"中正區\"}},\n    \"g\":{\n      \"name\":\"Sean\",\n      \"postal_code\":{\"name\":\"信義區\"}}}\n}\n```\n\n#### Example 4  [[ content... ]] List[ List... ]\n\u003e執行 db.team.find({ _id : ObjectId(\"557e58727a8ea2a9dfe2ef83\") }) 的原始資料\n\n```javascript\n{\n  \"_id\" : ObjectId(\"557e58727a8ea2a9dfe2ef83\"),\n  \"team\" : [\"zebra\",\"snake\"],\n  \"box_score\" : [\n    [\n      ObjectId(\"557e58727a8ea2a9dfe2ef86\"),\n      ObjectId(\"557e58727a8ea2a9dfe2ef87\"),\n      ObjectId(\"557e58727a8ea2a9dfe2ef88\")\n    ],\n    [\n      ObjectId(\"557e58727a8ea2a9dfe2ef89\"),\n      ObjectId(\"557e58727a8ea2a9dfe2ef8a\"),\n      ObjectId(\"557e58727a8ea2a9dfe2ef8b\")\n    ]\n  ]\n}\n```\n\n\u003eDSL\n\n```\n@findOne \u003cdb=game coll=game query={ _id : { $oid : \"557e58727a8ea2a9dfe2ef83\" } } projection={ _id : 0 }\u003e\n\u003c\n  box_score\n  [\n    @findOneById [db=game coll=box_score projection={ _id : 0 , user : 1 , pts : 1 }]\n    [\n      @findOneById \u003cdb=user coll=user projection={ _id : 0 , name : 1 }\u003e\n      user\n    ]\n  ]\n\u003e\n```\n\n\u003e執行 DSL 之後的結果\n\n```javascript\n{\n  \"team\":[\"zebra\",\"snake\"],\n  \"box_score\":[\n    [\n      {\"user\":{\"name\":\"Kirk\"},\"pts\":11},\n      {\"user\":{\"name\":\"Mick\"},\"pts\":5},\n      {\"user\":{\"name\":\"Sean\"},\"pts\":5}\n    ],\n    [\n      {\"user\":{\"name\":\"Toby\"},\"pts\":3},\n      {\"user\":{\"name\":\"Eric\"},\"pts\":6},\n      {\"user\":{\"name\":\"Glen\"},\"pts\":6}\n    ]\n  ]\n}\n```\n\n\n### Action 的迭代作用域\n\u003e可以用在屬性上的作用城有三種\n* @Action ( info... ) 位在 info 中的 @ 會以屬性的父層代入\n* @Action \u003c info... \u003e 位在 info 中的 @ 會以屬性本身代入\n* @Action [ info... ] 若屬性本身是個集合，則位在 info 中的 @ 會以各子項帶入，不然會以屬性本身代入但回傳 List\n\n\u003e位在 info 中的 @ 可以使用以下方法參照上層資料\n* @../.property 代入父層資料的 property 屬性\n* @../../.property 代入父層資料的 父層資料的 property 屬性\n* @.../.property 代入最上層資料的 property 屬性\n\n#### Example 5  ( info... )\n\u003e執行 db.postal_code.find({},{name:1}) 的原始資料\n\n```javascript\n[\n  { \"_id\" : ObjectId(\"557e56287a8ea2a9dfe2ef71\"), \"name\" : \"中正區\" },\n  { \"_id\" : ObjectId(\"557e56287a8ea2a9dfe2ef72\"), \"name\" : \"信義區\" },\n  { \"_id\" : ObjectId(\"557e56287a8ea2a9dfe2ef73\"), \"name\" : \"內湖區\" }\n]\n```\n\n\u003eDSL\n\n```\n@find \u003cdb=info coll=postal_code projection={ name : 1 }\u003e\n[\n  @count (db=user coll=user query={ height : { $gte : 200 } , postal_code : @._id })\n  num\n]\n```\n\n\u003e執行 DSL 之後的結果\n\n```javascript\n[\n  {\n    \"_id\":{\"$oid\":\"557e56287a8ea2a9dfe2ef71\"},\n    \"name\":\"中正區\",\n    \"num\":3\n  },\n  {\n    \"_id\":{\"$oid\":\"557e56287a8ea2a9dfe2ef72\"},\n    \"name\":\"信義區\",\n    \"num\":4\n  },\n  {\n    \"_id\":{\"$oid\":\"557e56287a8ea2a9dfe2ef73\"},\n    \"name\":\"內湖區\",\n    \"num\":1\n  }\n]\n```\n\n#### Example 6  \u003c info... \u003e\n\u003e執行 db.postal_code.find({},{_id:0,code:0}) 的原始資料\n\n```javascript\n[\n  { \"country\" : \"TW\", \"city\" : \"557e55af7a8ea2a9dfe2ef70\", \"name\" : \"中正區\" },\n  { \"country\" : \"TW\", \"city\" : \"557e55af7a8ea2a9dfe2ef70\", \"name\" : \"信義區\" },\n  { \"country\" : \"TW\", \"city\" : \"557e55af7a8ea2a9dfe2ef70\", \"name\" : \"內湖區\" }\n]\n```\n\n\u003eDSL\n\n```\n@find \u003cdb=info coll=postal_code projection={ _id : 0 , code : 0 }\u003e\n[\n  @findOne (db=info coll=country query={ _id : @.country } projection={ _id : 0 })\n  country\n\n  @findOne (db=info coll=city query={ _id : { $oid : @.city } } projection={ _id : 0 , country : 0 })\n  city\n]\n```\n\n\u003e執行 DSL 之後的結果\n\n```javascript\n[\n  {\n    \"country\":{\"name\":\"臺灣\"},\n    \"city\":{\"name\":\"臺北市\"},\n    \"name\":\"中正區\"\n  },\n  {\n    \"country\":{\"name\":\"臺灣\"},\n    \"city\":{\"name\":\"臺北市\"},\n    \"name\":\"信義區\"\n  },\n  {\n    \"country\":{\"name\":\"臺灣\"},\n    \"city\":{\"name\":\"臺北市\"},\n    \"name\":\"內湖區\"\n  }\n]\n```\n\n#### Example 7  [ info... ]\n\u003e執行 db.user.findOne({_id:ObjectId(\"557e58727a8ea2a9dfe2ef74\")},{_id:0,name:1,friends:1}) 的原始資料\n\n```javascript\n{\n  \"name\" : \"Bill\",\n  \"friends\" : [\n    ObjectId(\"557e58727a8ea2a9dfe2ef76\"),\n    ObjectId(\"557e58727a8ea2a9dfe2ef78\"),\n    ObjectId(\"557e58727a8ea2a9dfe2ef7e\")]\n}\n```\n\n\u003eDSL\n\n```\n@findOne [db=user coll=user query={ _id : { $oid : \"557e58727a8ea2a9dfe2ef74\" } } projection={ _id : 0 , name : 1 , friends : 1 }]\n\u003c\n  0 \n  \u003c\n    @findOneById [db=user coll=user projection={ _id : 0 , name : 1 }]\n    friends\n  \u003e\n\u003e\n```\n\n\u003e執行 DSL 之後的結果\n\n```javascript\n[\n  {\n    \"name\":\"Bill\",\n    \"friends\":[\n      {\"name\":\"Kirk\"},\n      {\"name\":\"Noah\"},\n      {\"name\":\"Andy\"}]\n  }\n]\n```\n\n\n### 目前支援的 Action\n\n#### DB Action\n* @find\n  * db\n  * coll\n  * index\n  * projection\n  * query\n  * sort\n  * skip\n  * limit\n\n* @findOne\n  * db\n  * coll\n  * index\n  * projection\n  * query\n\n* @findOneById\n  * db\n  * coll\n  * index\n  * projection\n\n* @distinct\n  * db\n  * coll\n  * index\n  * key\n  * query\n\n* @count\n  * db\n  * coll\n  * index\n  * query\n\n* @aggregate\n  * db\n  * coll\n  * index\n  * pipelines\n\n* @findFirstOne\n  * db\n  * coll\n  * index\n  * projection\n  * query\n  * sort\n  * skip\n  \n#### Data Action\n  \n* @fill\n  * value\n\n### 使用自訂 Action\n\u003e主要有二種方法可以選擇\n* extends DslAction 將一群 Action 的集合打包成一個 Action\n* extends DbAction 對單一個 DBColleciton 做自定的操作\n\n#### Example 8  DslAction\n\u003e新增一個 EmbedPostalCode 類別\n\n```java\npackage my.action;\n\nimport tw.com.ehanlin.mde.dsl.Dsl;\nimport tw.com.ehanlin.mde.dsl.action.data.DslAction;\nimport tw.com.ehanlin.mde.dsl.mongo.MdeDBObject;\n\npublic class EmbedPostalCode extends DslAction {\n\n    private static Dsl _actionDsl;\n\n    public EmbedPostalCode(Scope scope, MdeDBObject infos) {\n        super(scope, infos);\n    }\n\n    @Override\n    protected Dsl actionDsl() {\n        if(_actionDsl == null) {\n            _actionDsl = this.dsl().parser().parse(\"\" +\n                    \"@findOne \u003cdb=user coll=user query={ _id : { $oid : @ } }\u003e\\n\" +\n                    \"\u003c\\n\" +\n                    \"  @findOneById \u003cdb=info coll=postal_code projection={ _id : 0 }\u003e\\n\" +\n                    \"  postal_code\\n\" +\n                    \"  \u003c\\n\" +\n                    \"    @findOne \u003cdb=info coll=city query={ _id : { $oid : @ } } projection={ _id : 0 }\u003e\\n\" +\n                    \"    city\\n\" +\n                    \"    \u003c\\n\" +\n                    \"      @findOneById \u003cdb=info coll=country projection={ _id : 0 }\u003e\\n\" +\n                    \"      country\\n\" +\n                    \"    \u003e\\n\" +\n                    \"  \u003e\\n\" +\n                    \"\u003e\");\n        }\n        return _actionDsl;\n    }\n\n    @Override\n    public String toString() {\n        return toString(\"embedPostalCode\");\n    }\n}\n```\n\n\u003e註冊 EmbedPostalCode\n\n```java\nMongoEmbedder.dslParser.registerAction(\"embedPostalCode\", my.action.EmbedPostalCode.class);\n```\n\n\u003eDSL\n\n```\n@embedPostalCode []\n[\n  @findOneById [db=user coll=user projection={ _id : 0 , name : 1 }]\n  friends\n]\n```\n\n\u003e執行 DSL\n\n```java\n  BasicDBList list = new BasicDBList();\n  list.add(\"557e58727a8ea2a9dfe2ef76\");\n  list.add(\"557e58727a8ea2a9dfe2ef7a\");\n  MongoEmbedder.instance.embed(list, dsl);\n```\n\n\u003e執行 DSL 之後的結果\n\n```javascript\n[\n  {\n    \"_id\":{\"$oid\":\"557e58727a8ea2a9dfe2ef76\"},\n    \"name\":\"Kirk\",\n    \"postal_code\":{\n      \"country\":\"TW\",\n      \"city\":{\"country\":{\"name\":\"臺灣\"},\"name\":\"臺北市\"},\n      \"code\":\"100\",\n      \"name\":\"中正區\"},\n    \"height\":220,\n    \"friends\":[\n      {\"name\":\"Bill\"},\n      {\"name\":\"Mick\"},\n      {\"name\":\"Rick\"},\n      {\"name\":\"Andy\"}]\n  },\n  {\n    \"_id\":{\"$oid\":\"557e58727a8ea2a9dfe2ef7a\"},\n    \"name\":\"Rick\",\n    \"postal_code\":{\n      \"country\":\"TW\",\n      \"city\":{\"country\":{\"name\":\"臺灣\"},\"name\":\"臺北市\"},\n      \"code\":\"110\",\n      \"name\":\"信義區\"},\n    \"height\":218,\n    \"friends\":[\n      {\"name\":\"Kirk\"},\n      {\"name\":\"Toby\"},\n      {\"name\":\"Andy\"}]\n  }\n]\n```\n\n\n#### Example 9  Custom Action\n\u003e新增一個 FindLimit2 類別\n\n```java\npackage my.action;\n\nimport com.mongodb.BasicDBList;\nimport com.mongodb.DBCollection;\nimport com.mongodb.DBCursor;\nimport com.mongodb.DBObject;\nimport tw.com.ehanlin.mde.dsl.action.db.DbAction;\nimport tw.com.ehanlin.mde.dsl.mongo.MdeDBObject;\nimport tw.com.ehanlin.mde.util.DataStack;\nimport tw.com.ehanlin.mde.util.EmptyObject;\n\npublic class FindLimit2 extends DbAction {\n\n    public static final String KEY_QUERY = \"query\";\n\n    public FindLimit2(Scope scope, MdeDBObject infos) {\n        super(scope, infos);\n    }\n\n    public DBObject query(DataStack data) {\n        Object _query = evalInfo(KEY_QUERY, data);\n        return (DBObject)((_query != null) ? _query : EmptyObject.BasicDBObject);\n    }\n\n    @Override\n    public String toString() {\n        return toString(\"findLimit2\",\n                KEY_DB, infos().get(KEY_DB),\n                KEY_COLL, infos().get(KEY_COLL),\n                KEY_QUERY, infos().get(KEY_QUERY));\n    }\n\n    @Override\n    protected String cacheKey(DataStack data, String prefix) {\n        return prefix+query(data);\n    }\n\n    @Override\n    protected Object executeObject(DataStack data, DBCollection coll) {\n        BasicDBList result = new BasicDBList();\n        DBCursor cursor = coll.find(query(data)).limit(2);\n        while(cursor.hasNext()){\n            result.add(cursor.next());\n        }\n        cursor.close();\n        return result;\n    }\n\n}\n```\n\n\u003e註冊 EmbedPostalCode\n\n```java\nMongoEmbedder.dslParser.registerAction(\"findLimit2\", my.action.FindLimit2.class);\n```\n\n\u003e執行 db.user.find({height:{$gte:210}}) 的原始資料共 3 筆\n\n```javascript\n[\n  {\n    \"_id\" : ObjectId(\"557e58727a8ea2a9dfe2ef76\"),\n    \"name\" : \"Kirk\",\n    \"postal_code\" : ObjectId(\"557e56287a8ea2a9dfe2ef71\"),\n    \"height\" : 220,\n    \"friends\" : [\n      ObjectId(\"557e58727a8ea2a9dfe2ef74\"),\n      ObjectId(\"557e58727a8ea2a9dfe2ef77\"),\n      ObjectId(\"557e58727a8ea2a9dfe2ef7a\"),\n      ObjectId(\"557e58727a8ea2a9dfe2ef7e\")]\n  },\n  {\n    \"_id\" : ObjectId(\"557e58727a8ea2a9dfe2ef7a\"),\n    \"name\" : \"Rick\",\n    \"postal_code\" : ObjectId(\"557e56287a8ea2a9dfe2ef72\"),\n    \"height\" : 218,\n    \"friends\" : [\n      ObjectId(\"557e58727a8ea2a9dfe2ef76\"),\n      ObjectId(\"557e58727a8ea2a9dfe2ef7c\"),\n      ObjectId(\"557e58727a8ea2a9dfe2ef7e\")]\n  },\n  {\n    \"_id\" : ObjectId(\"557e58727a8ea2a9dfe2ef7c\"),\n    \"name\" : \"Toby\",\n    \"postal_code\" : ObjectId(\"557e56287a8ea2a9dfe2ef72\"),\n    \"height\" : 214,\n    \"friends\" : [\n      ObjectId(\"557e58727a8ea2a9dfe2ef7a\")]\n  }\n]\n```\n\n\u003eDSL\n\n```\n@findLimit2 \u003cdb=user coll=user query={ height : { $gte : 210 } }\u003e\n[\n  @findOneById [db=info coll=postal_code projection={ _id : 0 , name : 1 }]\n  postal_code\n]\n```\n\n\u003e執行 DSL 之後的結果，會被 limit 限制到 2 筆資料\n\n```javascript\n[\n  {\n    \"_id\":{\"$oid\":\"557e58727a8ea2a9dfe2ef76\"},\n    \"name\":\"Kirk\",\n    \"postal_code\":[{\"name\":\"中正區\"}],\n    \"height\":220,\n    \"friends\":[\n      {\"$oid\":\"557e58727a8ea2a9dfe2ef74\"},\n      {\"$oid\":\"557e58727a8ea2a9dfe2ef77\"},\n      {\"$oid\":\"557e58727a8ea2a9dfe2ef7a\"},\n      {\"$oid\":\"557e58727a8ea2a9dfe2ef7e\"}]\n  },\n  {\n    \"_id\":{\"$oid\":\"557e58727a8ea2a9dfe2ef77\"},\n    \"name\":\"Mick\",\n    \"postal_code\":[{\"name\":\"中正區\"}],\n    \"height\":211,\n    \"friends\":[\n      {\"$oid\":\"557e58727a8ea2a9dfe2ef76\"}]\n  }\n]\n```\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fehanlin%2Fmongodb-dbobject-embedder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fehanlin%2Fmongodb-dbobject-embedder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fehanlin%2Fmongodb-dbobject-embedder/lists"}