2017-04-24 99 views
0

我已经使用shell命令在Mongodb集合“clicklog”中为json文件建立了索引。下面是我的shell命令的结果:如何使用MongoDB shell从MongoDB集合获取特定字段?

db.clicklogs.find().pretty() 

输出:

{ 
      "_id" : ObjectId("58fe78dcfbe21fa7896552e8"), 
      "preview" : false, 
      "offset" : 0, 
      "result" : { 
        "search_term" : "484797", 
        "request_time" : "Sat Apr 01 23:58:49 -0400 2017", 
        "request_ip" : "127.0.0.1", 
        "stats_type" : "clickstats", 
        "upi" : "66024330304", 
        "unit" : "CITCS", 
        "job_title" : "IT Engineer", 
        "vpu" : "ICR", 
        "organization" : "73", 
        "location" : "MH", 
        "city" : "San Diego", 
        "country" : "USA", 
        "title" : "TOM", 
        "tab_name" : "People-Tab", 
        "page_name" : "PEOPLE", 
        "result_number" : "1", 
        "page_num" : "0", 
        "session_id" : "14e88b44576ad4fdc035bc41529762ad1", 
        "total_results" : "1", 
        "_raw":"request_time=Sat Apr 01 23:58:49 -0400 2017,request_ip=127.0.0.1,application=Search,stats_type=clickstats,upi=660243301304,unit=CITCS,job_title=IT Assistant, Client Services,vpu=ICR,location=DHAKA, BANGLADESH (IFC),organization=73,city=Dhaka,country=BANGLADESH,city_code=,search_term=484797,title= Tom,url=http://isearch.worldbank.org/skillfinder/ppl_profile_new/000484797,tab_name=People-Tab,page_name=PEOPLE,result_number=1,page_num=0,filter=qterm=484797,total_results=1,app_environment=production,log_version=1.0,session_id=4e88b44576ad4fdc035bc41529762ad1", 
        "_time":"2017-04-01T23:58:49.000-0400" 

      } 
    } 
{"_id" : ObjectId("58fe78dcfbe21fa7896552e9"), 
     "preview" : false, 
     "offset" : 0, 
     "result" : { 
       "search_term" : "demo", 
       "request_time" : "Sat Apr 01 23:58:49 -0400 2017", 
       "request_ip" : "127.0.0.1", 
       .... 
       "time":"2017-04-01T23:58:49.000-0400" 
} 
} 

对于每一个JSON文件,我想只得到几个字段(ID,搜索关键词,合众国际社,PAGE_NAME,会话ID, url(在_raw下))。是否有可能使用mongo shell命令并将结果文档存储在新集合中?任何帮助表示赞赏。

+0

你的mongodb版本是什么? – Veeram

+0

我在最新版本3.4.4 – Rose

回答

1

您可以在3.4版本中尝试下面的聚合。

查询使用$split操作符几次达到url值。其余是标准投影场。

$out阶段将结果写入新集合。

db.getCollection('clicklogs').aggregate([{ 
     $project: { 
      searchterm: "$result.searchterm", 
      upi: "$result.upi", 
      page_name: "$result.page_name", 
      session_id: "$result.session_id", 
      url: { 
       $let: { 
        vars: { 
         obj: { 
          $arrayElemAt: [{ 
           $split: ["$result._raw", ','] 
          }, 1] 
         } 
        }, 
        in: { 
         $arrayElemAt: [{ 
          $split: ["$$obj", '='] 
         }, 1] 
        } 
       } 
      } 
     } 
    }, 
    { 
     $out: "clicklogs_temp" 
    } 
]) 
+0

嘿Veeram,其实我并没有在问题的前面添加整个_raw数据。我更新了我的问题。该网址现在位于第18位。我试图通过将位置更改为17而不是1来尝试使用您的代码。但它没有在结果中获得URL字段。如果我将这个位置保持为1,那么我将获得具有request_ip值的URL字段。你能帮助我吗? – Rose

+0

它应该工作。只是为了确认你确实改变了第一个'arrayAtElement'索引值吧?如果是,请验证数据。它适用于我在帖子中提供的数据。 – Veeram

+0

是的。在obj和in中,我将areayAtElement更改为17次。我将再次检查。该集合约有6400个json文档。感谢您的回复。 – Rose

相关问题