2

私は、このコレクションが命名した「ポイント」MongoDBの集計フィルタと、私は私が欲しい集計クエリを実行する必要がありnodejs

[ 
    { 'guid': 'aaa' }, 
    { 'guid': 'bbb' }, 
    { 'guid': 'ccc' }, 
] 

を頼りに、私は別の名前の「ストリーム」

[ 
    { 'title': 'pippo', 'guid': 'aaa', 'email': '[email protected]'}, 
    { 'title': 'pluto', 'guid': 'aaa', 'email': '[email protected]'}, 
    { 'title': 'goofy', 'guid': 'bbb', 'email': '[email protected]'}, 
    { 'title': 'duck', 'guid': 'aaa', 'email': '[email protected]'}, 
    { 'title': 'minnie', 'guid': 'ccc', 'email': '[email protected]'}, 
] 

を持っています文字「o」を含むemailを検索します。私はすでにこの

db.getCollection('points').aggregate([ 
    { 
     $lookup: { 
      from: "stream", 
      localField: "guid", 
      foreignField: "guid", 
      as: "items" 
     } 
    }, 
    { 
     $project: { 
      _id: 0, 
      guid: 1, 
      items: { 
       $size: "$items" 
      } 
     } 
    } 
]); 

を行っている私は期待した結果がこの

[ 
    { 'guid': 'aaa', items: 2 }, 
    { 'guid': 'bbb', item: 1 }, 
    { 'guid': 'ccc', item: 0 }, 
] 

である私は、MySQLにあった場合は、クエリは、この

SELECT DISTINCT 
    points.guid, 
    (
     SELECT COUNT(*) 
     FROM stream 
     WHERE guid = stream.guid and stream.email like '%o%' 
    ) AS items 
FROM points 

答えて

0

回答はコメントに基づいて編集されます。

次のアグリゲーションパイプラインを試すことができます。

db.getCollection("points").aggregate([ 
         {"$lookup":{"from":"stream", "localField":"guid", "foreignField":"guid", as:"items"}}, 
         {"$unwind":"$items"}, 
         {"$group":{"_id": "$guid", "guid":{"$first":"$guid"}, "emails":{"$push":"$items.email"}}}, 
         {"$project":{"guid" :1, "emails":{"$setUnion":["$emails", [{"$literal":"io"}]]}}}, 
         {"$unwind":"$emails"}, 
         {"$match":{"emails":/[io]/}}, 
         {"$group":{"_id":"$guid", "items":{"$sum":1}}}, 
         {"$project":{"_id":0, "guid":"$_id", "items":{"$add":["$items", -1]}}} 
        ]) 

サンプル出力:

{ "items" : 3, "guid" : "aaa" } 
{ "items" : 1, "guid" : "ccc" } 
{ "items" : 1, "guid" : "bbb" } 

注:私はダミーの電子メールIDを導入している - 'OI'、条件に合致する満たす、ポイント収集からのデータが失われないようにすること。そして、このダミーフィールドを補償するために、-1が最終的にカウントから減じられる。

+0

よくやったが、私は、このSELECT COUNT(*) ストリーム GUID = stream.guid FROMと( '%Iの%' のような '%O%' またはstream.emailようstream.email)感謝が必要な場合 –

+0

@MauroSala:私の答えを更新しました。しかし、すべてのあなたの電子メールは、 "ディズニー"で "私"を持っています... – 4J41

+0

私はたくさんのまたはこのようなクエリを行う必要があります:SELECT COUNT(*)からストリームどこguid = stream.guidと(stream.email like ' %o% 'やstream.titleのように'%i% ')、あなたの答えは正しいです –

関連する問題