2013-02-28 12 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

+1

一言で言えば、いいえ、これを行う方法はありません(すべてのキー名を知っていても有益でしょう)。 –

+0

元の文書の固定されたフィールドセットを解決しようとするならば、これをaggフレームワークで行うことができます。 –

答えて

-1

私はMapReduceがこのタスクにもっと役立つと思います。

Asya Kamskyのコメントで書いたように、私の例はmongodbには間違っています。mongoDBにはofficial docsを使ってください。

+0

あなたはそうですmap/reduceはこれを行うことができますが、あなたがここで与えたことはうまくいかないでしょう。あなたの地図はやや間違っていて、あなたのreduce関数は完全に欠けているようです。 –

+0

map/reduceの仕組みではありません。あなたのreduce関数は、あなたのマップ関数が出すものと同じ形式を返す必要があり、複数回呼び出すこともできます。あなたのテストでは、いくつかの小さなテストセットに対して「正しい」答えを得ているかもしれませんが、実際のデータでは正しく動作しません。 –

+1

mapReduceのドキュメントページをご覧ください。 http://docs.mongodb.org/manual/reference/method/db.collection。mapReduce /#requirements-for-the-reduce-functionは、両方のファクトを一覧表示します(1回だけ発生するマップされたキーに対してreduceが全く呼び出されないという事実)。 –

2

集約フレームワークに完全なドキュメントにアクセスするメカニズムは、あなたが唯一のフィールドのサブセットを必要に応じて、あなたが行うことができ、現在ありません:

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

は集約、数十万ツイートを忘れてはいけません完全なドキュメントは、返された集約フレームワークの結果ドキュメントの16MBの制限にあなたを実行します。

あなたはこのようにMapReduceのを経由してこれを行うことができます:私は$$ROOT式は、この問題に対処することがわかったドキュメントで

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

+0

$$ ROOTでフルドキュメントにアクセスすることを提案しました。これは2.6で導入され、この質問/回答の時点では利用できませんでした。 https://jira.mongodb.org/browse/SERVER-9840 –

9
+1

この質問は、MongoDB 2.2が最新のときに尋ねられました。 - $$ ROOTがバージョン2.6(2014年初頭)に追加されました –

+1

おそらくあなたは[私のこの質問] http://stackoverflow.com/questions/39288087/mongodb-collection-with-different-language-texts-select-localized-texts)。問題は、サブ文書ではなく、 '{$ group:$$ ROOT}'のような文書そのものを得ることができないことです。現時点ではサブ文書としてしか使えません。 '{$ group:グループ:{_id: '$$ ROOT'}} ' – Miquel

+0

プロジェクションを先に使用するときにはどうすればいいですか? – Dane411