2017-04-24 127 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