目前,我有一个MongoDB的集合与以下类型的文件(〜1000个文档):蒙戈DB设计用于快速查询的范围
{ _id : "...",
id : "0000001",
gaps : [{start:100, end:110}, {start:132, end:166}...], // up to ~1k elems
bounds: [68, 88, 126, 228...], // up to 100 elems
length: 300,
seq : "ACCGACCCGAGGACCCCTGAGATG..."
}
“差距”和阵列指的是“边界”值“seq”和“length”中的坐标是指“seq”长度。 我已经定义了“id”,“gaps”和“bounds”的索引。 我需要根据坐标范围进行查询。例如,给定“from = 100”和“to = 200”,我想为每个文档检索一个“间隙”的子数组,一个位于范围内的“bounds”和“seq”子字符串的子数组在这种情况下在100和200之间)。 眼下,这是使用以下聚集管道进行:
db.annot.aggregate(
{$match : {"id" : "000001"}},
{$unwind : "$gaps"},
{$unwind : "$bounds"},
{$match: {
$or :[
{"gaps.start" : {$gte:from, $lte:to}},
{"gaps.end" : {$gte:from, $lte:to}},
{"bounds" : {$gte:from, $lte:to}}
]
}
},
{$project:{
id:1,
gaps:1,
bounds:1,
subseq:{$substr:["$seq", from, (to-from)]}}},
{$group : {
_id : "$id",
gaps : {"$addToSet" : "$gaps"},
bounds : {"$addToSet" : "$bounds"},
subseq : {"$first" : "$subseq"}}},
)
- 查询整个集合(留出在管道中的第一个“$匹配”)大约需要14秒。
- 依次查询所有文档每个最多需要50毫秒(总共约19秒)。
- 单独查询所有文档并行需要总共约7秒。
- 使用只与id匹配的管道(即,使用管道中的第一个“$匹配”)查询总共花费约5秒。
什么是最好的数据库和查询设计,以最大限度地提高这类查询的性能?
缺口和边界之间的关系是什么?麻烦的是双$ unwinds,它会把你的一个文档从它产生多达100 * 1000个文档,每一个对(间隙,边界)一个文档。另外,通过顺序查询和并行查询,你究竟意味着什么? – wdberkeley
差距和界限之间没有关系。它们都是指seq字段的坐标,但它们没有彼此之间的关系。是的,我知道“$ unwinds”会为每个缺口/限定对创建单个文档,这就是为什么我想更改文档/收集格式的原因。通过“顺序”我的意思是我查询每个文件(例如)在for循环(上面的“聚合”查询)和“并行”我的意思是我创建不同的线程(多核心),并运行并行查询。 – emepyc