sql >> データベース >  >> NoSQL >> MongoDB

MongoDBで集約/交差の設定を実行します

    これはやや複雑な解決策です。アイデアは、最初にDBを使用して可能なペアの母集団を取得し、次に向きを変えてDBに_userでペアを見つけるように依頼することです。 分野。何千人ものユーザーがかなり大きなペアリングリストを作成することに注意してください。 $addFieldsを使用します 例に示されているよりも多くの入力レコードがある場合に備えて、そうでない場合は、効率を上げるために$projectに置き換えてください。 パイプを流れる材料の量を減らすため。

    //
    // Stage 1:  Get unique set of username pairs.
    //
    c=db.foo.aggregate([
    {$unwind: "$_user"}
    
    // Create single deduped list of users:
    ,{$group: {_id:null, u: {$addToSet: "$_user"} }}
    
    // Nice little double map here creates the pairs, effectively doing this:
    //    for index in range(0, len(list)):
    //      first = list[index]
    //      for p2 in range(index+1, len(list)):
    //        pairs.append([first,list[p2]])
    // 
    ,{$addFields: {u: 
      {$map: {
        input: {$range:[0,{$size:"$u"}]},
        as: "z",
        in: {
            $map: {
                input: {$range:[{$add:[1,"$$z"]},{$size:"$u"}]},
                as: "z2",
                in: [
                {$arrayElemAt:["$u","$$z"]},
                {$arrayElemAt:["$u","$$z2"]}
                ]
            }
        }
        }}
    }}
    
    // Turn the array of array of pairs in to a nice single array of pairs:
    ,{$addFields: {u: {$reduce:{
            input: "$u",
            initialValue:[],
            in:{$concatArrays: [ "$$value", "$$this"]}
            }}
        }}
              ]);
    
    
    // Stage 2:  Find pairs and tally up the fileids
    
    doc = c.next(); // Get single output from Stage 1 above.                       
    
    u = doc['u'];
    
    c2=db.foo.aggregate([
    {$addFields: {_x: {$map: {
                    input: u,
                    as: "z",
                    in: {
                        n: "$$z",
                        q: {$setIsSubset: [ "$$z", "$_user" ]}
                    }
                }
            }
        }}
    ,{$unwind: "$_x"}
    ,{$match: {"_x.q": true}}
    //  Nice use of grouping by an ARRAY here:
    ,{$group: {_id: "$_x.n", v: {$push: "$_id.fileid"}, n: {$sum:1} }}
    ,{$match: {"n": {"$gt":1}}}
                         ]);
    
    show(c2);
    



    1. MongoDBネストされた配列クエリ

    2. 変更ストリームを使用して本番環境でMongoDBを実行するためのヒント

    3. コマンドラインからHerokuがホストするRedisに安全に接続するにはどうすればよいですか?

    4. 集約フレームワークの$skipと$limit