2013-02-28 148 views
7

我可以使用'$'操作符引用MongoDB聚合管道中各個屬性值的值。但是,如何訪問(引用)整個文檔?在MongoDB聚合管道中引用整個文檔


UPDATE:提供用於解釋場景的一個例子。

這裏是什麼,我試圖做一個例子。我收集了一些推文。並且每條推文都有一個成員'羣集',這表示特定推文屬於哪個羣組。

{ 
    "_id" : "5803519429097792069", 
    "text" : "The following vehicles/owners have been prosecuted by issuing notice on the basis of photographs on dated... http://t.co/iic1Nn85W5", 
    "oldestts" : "2013-02-28 16:11:32.0", 
    "firstTweetTime" : "4 hours ", 
    "id" : "307161122191065089", 
    "isLoc" : true, 
    "powertweet" : true, 
    "city" : "new+delhi", 
    "latestts" : "2013-02-28 16:35:05.0", 
    "no" : 0, 
    "ts" : 1362081807.9693, 
    "clusters" : [ 
     { 
      "participationCoeff" : 1, 
      "clusterID" : "5803519429097792069" 
     } 
    ], 
    "username" : "dtptraffic", 
    "verbSet" : [ 
     "date", 
     "follow", 
     "prosecute", 
     "have", 
     "be" 
    ], 
    "timestamp" : "4 hours ", 
    "entitySet" : [ ], 
    "subCats" : { 
     "Generic" : [ ] 
    }, 
    "lang" : "en", 
    "fns" : 18.35967, 
    "url" : "url|109|131|http://fb.me/2CeaI7Vtr", 
    "cat" : [ 
     "Generic" 
    ], 
    "order" : 7 
} 

因爲在我的收藏中有幾十萬鳴叫,我想按'clusters.clusterID'分組所有鳴叫。基本上,我想編寫一個查詢類似以下內容:

db.tweets.aggregate (
{ $group : { _id : '$clusters.clusterID', 'members' : {$addToSet : <????> } } } 
) 

我要訪問當前文檔處理,並引用它,我已經把上面的查詢。有誰知道如何做到這一點?

+1

你有什麼你正在嘗試做一個例子嗎? – RickyA 2013-02-28 19:15:27

+1

簡而言之 - 不,沒有辦法做到這一點(如果你知道所有的關鍵名稱,但這不太可能有幫助)。 – 2013-02-28 20:03:23

+0

如果您願意爲原始文檔的固定字段設置解決方案,您可以在agg框架中執行此操作。 – 2013-03-01 00:49:43

回答

-1

我認爲MapReduce更適合這項任務。

Asya Kamsky在評論中寫道,我的示例對於mongodb不正確,請使用official docs作爲mongoDB。

+0

你是對的,地圖/減少可以做到這一點,但你給這裏的東西是行不通的。你的地圖有點不對,你的縮小功能似乎完全丟失。 – 2013-03-01 00:47:25

+0

這不是map/reduce的工作方式。您的reduce函數必須返回與您的map函數發出的格式相同的格式,也可能會多次調用它。您的測試可能已經爲某些小測試集提供了「正確」的正確答案,但它在實際數據上無法正確工作。 – 2013-03-01 08:30:54

+1

請參閱mapReduce的文檔頁面。 http://docs.mongodb.org/manual/reference/method/db.collection。mapReduce /#requirements-for-the-reduce-function列出了這些事實(加上減少將不會被調用的映射鍵只會出現一次) – 2013-03-01 13:48:17

2

目前沒有機制來訪問聚合框架完整的文檔,如果你只需要領域的一個子集,你可以這樣做:

db.tweets.aggregate([ {$group: { _id: '$clusters.clusterID', 
            members: {$addToSet : 
             { user: "$user", 
             text: "$text", // etc for subset 
                 // of fields you want 
             } 
            } 
           } 
         } ]) 

不要幾十萬鳴叫忘記,彙總完整的文檔將使您返回到返回的聚合框架結果文檔的16MB限制。

您可以像這樣通過MapReduce的做到這一點:

var m = function() { 
    emit(this.clusters.clustersID, {members:[this]}); 
} 

var r = function(k,v) { 
    res = {members: [ ] }; 
    v.forEach(function (val) { 
    res.members = val.members.concat(res.members); 
    }); 
    return res; 
} 

db.tweets.mapReduce(m, r, {out:"output"}); 
+0

我有同樣的問題,BatScream提供了以下解決方案。 http://stackoverflow.com/questions/34404834/how-to-group-and-select-document-corresponding-to-max-within-each-group-in-mongo?noredirect=1#comment56552218_34404834。他建議通過$$ ROOT訪問完整文檔 – user1700890 2015-12-24 15:06:16

+0

$$ ROOT是在2.6中引入的,並且在此問題/回答時不可用。 https://jira.mongodb.org/browse/SERVER-9840 – 2015-12-26 22:50:46

9

在我發現$$ROOT表達解決這個問題的文檔。

從DOC: http://docs.mongodb.org/manual/reference/operator/aggregation/group/#group-documents-by-author

+1

這個問題被問到MongoDB 2.2是否是最新版本 - $$ ROOT是在2.6版本中添加的(2014年初) – 2015-12-26 22:51:55

+1

也許你可以回答[我的這個問題]( http://stackoverflow.com/questions/39288087/mongodb-collection-with-different-language-texts-select-localized-texts)。問題是我想獲取文檔本身,而不是作爲子文檔,那種不可能的'{$ group:$$ ROOT}',目前它可以作爲子文檔:'{$組:{_id:'$$ ROOT'}}' – Miquel 2016-09-02 10:07:53

+0

如何在首次使用投影時進行此項工作? – Dane411 2017-06-30 21:07:06