2

これが私のドキュメント構造です:

{
 "_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 フレームワークを本当に楽しんでいますが、このグループ化パイプラインに問題があり、まだ別のコレクションに $out できないためです。このマルチグループ パイプラインを実行できます。

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 文字列がいくつあるかを知ることができます。次に、長さでグループ化し、その長さでグループ化された文字列の数を数えたいと思います。

4

1 に答える 1

5

私が質問を正しく理解していれば、これがあなたが探しているものです。重要な概念は、複数のフィールドから複合 _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"}
         }
    }
])
于 2013-01-18T04:29:19.797 に答える