2016-11-03 11 views
0

はどのようmogoDB線ドライバを介してこれを行うことができます。mongodb-wire-protocol(OP_QUERY)経由でdb.collection.aggregate()を実行する方法は?

db.collection.aggregate(
    [ 
     { $match: <query condition> }, 
     { $group: { _id: null, count: { $sum: 1 } } } 
    ] 
) 

クエリ文字列を構築するために、特にどのように?

私は、孤立したドキュメントが存在すると数が不正確になることを避けるため、db.collection.aggregate()メソッドの$ groupステージを使用してドキュメントを合計します。

答えて

1

ワイヤプロトコルを使用する場合、ドライバによって提供されるラッパーメソッドは、プロトコルから非常に削除されたように見えることがあります。例えば、db.collection.aggregate():あなたは集計dbcmdを下に見たとき https://docs.mongodb.com/manual/reference/method/db.collection.aggregate/

はしかし、それはあなたに多くの手がかりを与える: https://docs.mongodb.com/manual/reference/command/aggregate/#dbcmd.aggregate

ですから、例えば、あなたは、ワイヤプロトコルドライバを持っている場合にOP_QUERYは、その後、DOC_ITEMSと呼ばれるアイテムの配列です別のフィールドとフィールドDOC_NAMEを持つドキュメントを含むコレクションCOLL_nameとデータベースdb_nameのために、あなたは、以下の擬似プロトコルとして集計クエリを実行することができます実装します

OP_QUERY - DB=DB_name, COLL=$cmd 
#skip=0 
#return=1 
query:{ 
    "aggregate": "COLL_name", 
    "pipeline": [ 
     { 
     "$project": { 
      "n_items": { 
       "$size": "$DOC_ITEMS" 
      }, 
      "DOC_NAME": 1 
     } 
    } 
    ] 
} 
fields:{ 
} 

あなたのライブラリーは、キーと値の操作を「置く」とオブジェクトと配列を提供している場合、クエリは以下の手順で構築される:

Pipeline = new Array(); 
ProjectionItems = new Object(); 

Size = new Object(); 
Size.Put ("$size", "$DOC_ITEMS"); 

//calculated field 
ProjectionItems.Put ("n_items", Size);    

//include "DOC_NAME" field in result projection 
ProjectionItems.Put ("DOC_NAME", 1);    

Projection_PipelineCmd = new Object(); 
Projection_PipelineCmd.Put ("$project", ProjectionItems); 

//add the projection definition to the pipeline array 
Pipeline.Put (Projection_PipelineCmd); 

Query = new Object(); 
Query.Put ("aggregate", "COLL_name"); 
Query.Put ("pipeline", Pipeline); 

希望これは正しい方向にあなたを指して!

関連する問題