2017-07-17 62 views
0

我在php上使用MongoDB。 當我查找時,返回一個MongoDB \ Driver \ Cursor。MongoDB查找光標vs toArray迭代和num請求

什麼是更好的方法來迭代檢索的數據?

foreach($cursor as $entry){} 

foreach($cursor->toArray() as $entry){} 

多少請求到服務器上的每個方法都送? 如果不止一個,有沒有辦法用一個請求檢索所有數據?

在此先感謝。

回答

1

只要開始迭代遊標,MongoDB就會批量返回文檔(默認批量大小爲101)。在第一次迭代時,一個調用命令到達服務器以獲取第一批文檔並且驅動程序在本地存儲這些文檔。在後續迭代中,驅動程序從本地提供文檔,直到迭代達到批處理大小。因此,在第102次迭代中,驅動程序再次將呼叫發送到服務器以獲取下一批,等等。

您可以通過在find方法提供可選的參數batchSize設置批量大小,更多的幫助,可以找到here

方法1:

foreach($cursor as $entry){} 

方法2:

foreach($cursor->toArray() as $entry){} 

$cursor->toArray以迭代遊標並將結果返回給數組的方式實現。因此,當您使用這些方法時,對服務器的調用次數相同。唯一的區別是,您將通過使用方法2獲得一組結果集。

缺點使用方法2的:

  • 結果集迭代兩次,一次在toArray方法,一旦當你從數組項。
  • 如果結果集中包含大量文檔,則可能會出現內存問題(內存不足)。

回答你的問題

方法1將更好地實現,如果你想在光標迭代,以儘量減少調用服務器的數量只設置batchSize明確(通過提供可選方法中的參數batchSize中的find方法)。