这是我的文档结构:
{
"_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字符串。然后我想按长度对它进行分组,并计算长度为多少个字符串组。
答案 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"}
}
}
])