MongoDB聚合管道多个组使管道变得复杂

时间:2013-01-18 03:30:41

标签: mongodb aggregation-framework database

这是我的文档结构:

{
 "_id" : ObjectId("50dcd7ff4de274a2c4a31df0"),
 "seq_name" : "169:D18M6ACXX:1:1111:17898:82486:GTGACA_10",
 "raw_seq" : "TTGACCTGAGGAGACGGTGACCAGGGTTCCCTGGCCCCAGTAGTCAACGGGAGTTAGACTTCTCGCACAGTAATAAACAGCCGTGTCCTCGGCTCTCAGGCTGTTCATTTGCAGA",
 "seq_aa" : "LQMNSLRAEDTAVYYCARSLTPVDYWGQGTLVTVSSGQ",
 "cdr3_seq" : "GCGAGAAGTCTAACTCCCGTTGACTAC",
 "cdr3_seq_aa" : "ARSLTPVDY",
 "cdr3_seq_len" : 27,
 "cdr3_seq_aa_len" : 9,
 "vg" : "IGHV3-48*03",
 "dg" : "IGHD3-10*02R",
 "jg" : "IGHJ4*02",
 "donor" : 10
}

我真的很喜欢MongoDB框架,但我在使用这个分组管道方面遇到了麻烦,因为我还不能将其转移到另一个集合中。我可以做这个多分组管道。

db.collection.aggregate({$match:{cdr3_seq_aa_len:{$gt:3}},
   {$group:{_id:$cdr3_seq_aa,other_set:{$addToSet:$cdr3_seq_aa_len}}},
   {$group:{_id:$other_set,sum:{$sum:1}}})

这给了我多少唯一 $ cdr3_seq_aa'它们按长度分组。

{ id:40, sum:1002031,
  id:41, sum:1949402,....

然而,我想做的第一项行动是按捐助者分组。所以我首先要知道每个捐赠者中有多少独特的cdr3_seq_aa字符串。然后我想按长度对它进行分组,并计算长度为多少个字符串组。

1 个答案:

答案 0 :(得分:4)

如果我正确理解了这个问题,那就是你正在寻找的。关键概念是你可以从多个领域构建复合_id。

db.collection.aggregate(
[
    {$match: {cdr3_seq_aa_len: {$gt: 3}}},
    {$group: 
         {
              _id: {donor: "$donor", cdr3_seq_aa: "$cdr3_seq_aa"},
              donor_cdr3_seq_aa_count: {$sum: 1},
              cdr3_seq_aa_len: {$first: "$cdr3_seq_aa_len"}
         }
    },
    {$group:
         {
             _id: {donor: "$_id.donor", len: "$cdr3_seq_aa_len"},
             num_strings_with_this_length: {$sum: 1},
             total_doc_count_by_length:
                  {$sum: "$donor_cdr3_seq_aa_count"}
         }
    }
])