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

mongodb集計クエリを使用して別のコレクションから結合された複数のフィールドを明確にカウントする必要があります

    これでうまくいくはずです。私はあなたの入力セットでそれをテストし、NYCのようないくつかの重複値を意図的に追加しました 複数のDESTINATIONに表示される 重複排除されていることを確認します(つまり、要求されたとおりに明確にカウントします)。楽しみのために、すべてのステージをコメントアウトしてから、コメントを外して、パイプラインの各ステージの効果を確認します。

    var id = "1";
    
    c=db.foo.aggregate([
    // Find a thing:
    {$match: {"_id" : id}}
    
    // Do the lookup into the objects collection:
    ,{$lookup: {"from" : "foo2",
                "localField" : "objectsIds",
                "foreignField" : "_id",
                "as" : "objectResults"}}
    
    // OK, so we've got a bunch of extra material now.  Let's
    // get down to just the metaDataMap:
    ,{$project: {x: "$objectResults.metaDataMap"}}
    ,{$unwind: "$x"}
    ,{$project: {"_id":0}}
    
    // Use $objectToArray to get all the field names dynamically:
    // Replace the old x with new x (don't need the old one):
    ,{$project: {x: {$objectToArray: "$x"}}}
    ,{$unwind: "$x"}
    
    // Collect unique field names.  Interesting note: the values
    // here are ARRAYS, not scalars, so $push is creating an
    // array of arrays:
    ,{$group: {_id: "$x.k", tmp: {$push: "$x.v"}}}
    
    // Almost there!  We have to turn the array of array (of string)
    // into a single array which we'll subsequently dedupe.  We will
    // overwrite the old tmp with a new one, too:
    ,{$addFields: {tmp: {$reduce:{
        input: "$tmp",
        initialValue:[],
        in:{$concatArrays: [ "$$value", "$$this"]}
            }}
        }}
    
    // Now just unwind and regroup using the addToSet operator
    // to dedupe the list:
    ,{$unwind: "$tmp"}
    ,{$group: {_id: "$_id", uniqueVals: {$addToSet: "$tmp"}}}
    
    // Add size for good measure:
    ,{$addFields: {size: {"$size":"$uniqueVals"}} }
              ]);
    


    1. MongoDBデータモデリング中に考慮すべき運用上の要因

    2. mongodbのコレクションの最大サイズはいくつですか

    3. MongoDBに格納されている配列は順序を維持しますか?

    4. Laravel 5でネストされたオブジェクトをMongoDBに挿入するにはどうすればよいですか?