2017-06-07 139 views
0

我在PyMongo中使用$ lookup來成功「加入」兩個集合(這是可行的)。我遇到問題,即我加入的第二個集合在返回所有記錄時可能會超過BSON文檔大小。MongoDB聚集限制查找

我期待使用$極限限制所允許「match_docs」,例如下加入記錄數:從「意見」 100的最大記錄每obj_id:

db.indicators.aggregate([ 
    { 
    "$lookup": { 
     "from": "comments", 
     "localField": "_id", 
     "foreignField": "obj_id", 
     "as": "match_docs" 
    } 
    } 
]) 

我已經試過各種$限制的類型,它似乎只限制整體結果的總數,而不僅僅是加入。

+0

你可以不設置在$查找的限制,但你並不需要這使查詢工作。將'{allowDiskUse:true}'添加到您的聚合選項應該可以解決問題 – felix

+0

@felix OP正在討論BSON文檔大小限制,而不是內存限制。 –

+1

爲了減少結果,您可以''匹配'從'$ lookup'返回的內容嗎?當流水線階段是'$ lookup' - >'$ unwind' - >'$ match'並且'$ match'(相繼)和'$ match'中的條件引用了$ lookup',後兩個階段被「提升」到'$ lookup'中。這是一個優化,以減少可能的條目返回。 –

回答

1

如果你做一個$unwind緊跟在$lookup,管道將得到優化,基本上結合了兩個階段幫助繞過16MB的限制,可能會導致從$lookup返回大量的文件。

請記住,如果外部收集中的單個文檔加上本地集合中文檔的大小超過16 MB,則此優化無法提供幫助。

+0

還要注意,如果'$ unwind'之後跟着'$ match',它處理外部集合,那麼查詢條件也會與'$ unwind'一起被「懸掛」到'$ lookup'中。你可以使用'{「explain」:true}'作爲參數來看這個聚合。 –

+0

@NeilLunn這裏有一些注意事項:https://jira.mongodb.org/browse/SERVER-21612。此外,要爲隨後的「$ match」使用索引,您需要有一個以'$ lookup'使用的字段開頭的複合索引,後面跟着'$ match'中的字段。 –

+0

索引與我在這裏說的無關,這是一個單獨的問題。您在這裏所做的兩個回覆看起來好像是由某人在Google中搜索條件完成的,並且可以通過示例來闡明整個故事。 –

1

我能弄明白。

$查找 - > $匹配 - > $項目

db.indicators.aggregate([{ 
    "$lookup": { 
     "from": "comments" 
     , "localField": "_id" 
     , "foreignField": "obj_id" 
     , "as": "match_docs" 
    } 
}, { 
    "$match": { 
     "match_docs": { 
      "$exists": True 
     } 
    } 
}, { 
    "$project": { 
     "match_docs_agg": { 
      "$slice": ["$match_docs", 3] 
     } 
    } 
}]) 
+1

討厭你的泡泡,但實際上並沒有做任何事情來避免BSON限制被打破。它也是一個「給定」來測試數組字段的存在,因爲它在「$ lookup」的輸出中始終是「創建的」。「$切片」只會在「已經拉入文檔之後減小結果的大小」,所以BSON限制仍然可以被破壞。這對你來說唯一的理由是因爲拉入的文件實際上並沒有打破這個限制。無論如何,16MB是相當多的 –

+0

你100%正確,它只是在返回「3」的意義上做了我想要的,但它仍然在流水線中斷。 – gleb1783

+0

您可以改爲在您的問題中顯示您打算進行的聚合。根據你的「意圖」,我的意思是'$ lookup'操作,以及你想要對接下來的信息進行的聚合操作,即使它只是一個'$ slice'。然後,我可以真正展示你要做什麼。 –