想象一下包含大約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