想象一下包含大约5,000,000个文档的集合。我需要做一个basicCursor
查询来选择基于太多字段进行索引的〜100个文档。我们称之为basicCursorMatch
。这将非常缓慢。我可以在MongoDB光标上做第二个'查询'吗?
但是我可以在bTreeCursor
上查询几个索引,这会限制我的搜索到500个文档。我们称这个查询为bTreeCursorMatch
。
有没有一种方法可以直接在上做游标或从bTreeCursorMatch
产生的集合?
凭直觉我试图
var cursor = collection.find(bTreeCursorMatch);
var results = cursor.find(basicCursorMatch);
类似collection.find(bTreeCursorMatch).find(basicCursorMatch)
,这似乎并没有工作。
另外,我希望我可以做这样的事情:
collection.aggregate([
{$match: bTreeCursorMatch}, // Uses index 5,000,000 -> 500 fast
{$match: basicCursorMatch}, // No index, 500 -> 100 'slow'
{$sort}
]);
..但似乎我不能做到这一点无论是。有没有别的办法可以做我想做的事?
我问的原因是因为这第二个查询将有很大的不同,我没有办法索引所有的字段。但我确实希望使用bTreeCursor
进行第一个查询,否则查询整个集合将永远使用basicCursor
。
更新
此外,通过用户输入的文档500的部分选定将被以不同的方式在会话期间与不可预测的basicCursor
查询查询,使用多个$in
$eq
$gt
$lt
。但在此期间,bTreeCursor
子选举仍然相同。我应该继续为每个用户查询做两个查询吗,还是有一种更有效的方法来保存这个集合的reference
?
您不能连接查询,因为游标在数据库中'实时',它们已经包含查询和光标位置。但是,您可以简单地在查询末尾追加附加条件*,或者强制使用索引。 – mnemosyn
使用两个$ match元素定义聚合管道可行。你收到了什么错误信息? –
@Pascal Bugnion认真吗?那我一定做错了。我会尽快再试一次。这会为第一个查询使用索引吗?或者它会合并查询并使用基本光标?我使用的是MongoDB'2.4',也许这两个$匹配需要'3.0'? – Redsandro