1

文書のセット内のフィールドの数を数えます。 ユーザーコレクションからbadge_slug = 100_clubを持つすべてのバッジを数えたいと思います。関係なく、そのより、その後1時間を100_clubを持っていない私が試してみました何のMongoDB PHPは:私はMongoDBのライブラリ <a href="https://github.com/intekhabrizvi/Codeigniter-mongo-library" rel="nofollow">https://github.com/intekhabrizvi/Codeigniter-mongo-library</a></p> <p>以下の私のコレクション「ユーザー」であるとCodeIgniterは使用しています

$this->mongo_db->where(array('badges.badge_slug'=>"100_club"))->count('users'); 

ですが、それだけでユーザーの数を示します。

{ 
"_id" : ObjectId("57b83ae9faa76bac338b4579"), 
"displayname" : "test", 
"email" : "[email protected]", 
"badges" : [ 
    { 
     "awarded_at" : ISODate("2015-04-21T05:52:06Z"), 
     "object_id" : "", 
     "badge_slug" : "100_club" 
    }, 
    { 
     "awarded_at" : ISODate("2015-04-21T06:12:14Z"), 
     "object_id" : "", 
     "badge_slug" : "100_club" 
    }, 
    { 
     "awarded_at" : ISODate("2015-04-21T07:09:55Z"), 
     "object_id" : "", 
     "badge_slug" : "reader" 
    } 
] 
} 
{ 
    "_id" : ObjectId("57b83ae9faa76bac338b457a"), 
    "displayname" : "test2", 
    "email" : "[email protected]", 
    "badges" : [ 
     { 
      "awarded_at" : ISODate("2015-04-21T06:44:20Z"), 
      "object_id" : "", 
      "badge_slug" : "100_club" 
     } 
    ] 
} 

ユーザーコレクションで発生した100_clubの総数を取得する方法を教えてください。あなたは合計数を取得するには、ドキュメントごとに、カウントし、グループすべての文書を取得するために$filter$size演算子を使用することができる場所

答えて

1

集約的なアプローチは、以下の通りです。このアプローチは、バッジの配列を平らにする$unwind演算子を使用して必要とするが、MongoDBのバージョン3.2以上で動作しません:シェル

モンゴ

var ops = [ 
    { 
     "$project" { 
      "count": { 
       "$size": { 
        "$filter": { 
         "input": "$badges", 
         "as": "badge", 
         "cond": { "$eq": ["$$badge.badge_slug", "100_club"] } 
        } 
       } 
      } 
     } 
    }, 
    { 
     "$group": { 
      "_id": null, 
      "total": { "$sum": "$count" } 
     } 
    } 
]; 
db.users.aggregate(ops); 

PHP

$ops = array(
    array(
     "$project" => array(
      "count" => array(
       "$size" => array(
        "$filter" => array(
         "input" => "$badges", 
         "as" => "badge", 
         "cond" => array("$eq" => => array("$$badge.badge_slug", "100_club")) 
        ) 
       ) 
      ) 
     ) 
    ), 
    array(
     "$group" => array(
      "_id" => null, 
      "total" => array("$sum" => "$count") 
     ) 
    ) 
); 
$this->mongo_db->aggregate("users", $ops); 

最初のグループ化の前にバッジアレイを平坦化する$unwind演算子を使用してアプローチするため、この例は、次のとおり

Mongoの

db.users.aggregate([ 
    { "$match": { "badges.badge_slug": "100_club" } 
    { "$unwind": "$badges" }, 
    { "$match": { "badges.badge_slug": "100_club" }, 
    { 
     "$group": { 
      "_id": null, 
      "total": { "$sum": 1 } 
     } 
    } 
]) 
+1

どうもありがとうシェル。それは魅力のように働いた。 –

関連する問題

 関連する問題