jwi*_*720 2 database mongodb aggregation-framework
这是我的文档结构:
{
"_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
}
Run Code Online (Sandbox Code Playgroud)
我真的很喜欢 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}}})
Run Code Online (Sandbox Code Playgroud)
这给了我按长度分组的唯一$cdr3_seq_aa 的数量。
{ id:40, sum:1002031,
id:41, sum:1949402,....
Run Code Online (Sandbox Code Playgroud)
然而,我想做的第一个手术是按捐赠者分组。所以我可以先知道每个捐助者之间有多少个唯一的 cdr3_seq_aa 字符串。然后我想按长度对它进行分组并计算有多少字符串与长度分组。
如果我正确理解了这个问题,这就是你要找的。关键概念是您可以从多个字段构造复合 _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"}
}
}
])
Run Code Online (Sandbox Code Playgroud)