簡體   English   中英

MongoDB / PHP-MapReduce最大值

[英]MongoDB/PHP - MapReduce Max value

我曾經通過PHP在mongoDB上分組以獲取項目的最大日期。 由於我有太多項目(超過1萬個),我讀到我必須使用MapReduce。

這是我過去的組函數:

$keys = array('ItemDate'=> true);       
$initial = array('myLastDate' => 0);        
$reduce = "function(obj, prev) { 
  if (myLastDate < obj.ItemDate) { 
    myLastDate = ItemDate; 
  } 
}";         
$conds = array( 'ItemID' => (int) $id );

$results = $db->items->group($keys, $initial, $reduce,
array('condition'=> $conds ) );

我嘗試了一些東西,但似乎不起作用...

$map = new MongoCode("function() { 
  emit(this.ItemID,this.ItemDate);
}");        
$reduce = new MongoCode("function(obj, prev) { 
  if(prev.myLastDate < obj.ItemDate) { 
    prev.myLastDate = obj.ItemDate; 
  }
}");

$items = $db->command(array(
            "mapreduce" => "items", 
            "map" => $map,
            "reduce" => $reduce,
            "query" => array("ItemID" =>  $id);

$results = $db->selectCollection($items['result'])->find();

你能幫忙嗎?

您不需要為此使用map / reduce。 只要您的日期字段包含一個ISODate,一個簡單的查詢就可以解決問題:

db.yourColl.find({},{_id:0,ItemDate:1}).sort({ItemDate:-1}).limit(1)

為了有效地完成此查詢,您需要在ItemDate上設置一個索引

db.yourColl.createIndex({ItemDate:-1})

說明

查詢

讓我們剖析查詢。 db.yourColl ...

  • .find({}默認查詢
  • ,{_id:0,ItemDate:1}我們只希望返回ItemDate 這稱為投影
  • .sort({ItemDate:-1})返回的文檔應在ItemDate上以降序排列,使具有最新日期的文檔成為最先返回的文檔。
  • .limit(1)並且由於我們只想要最新的,所以將結果集限制為它。

指標

我們以降序創建索引,因為這是您使用索引的方式。 但是,如果您需要將默認查詢更改為其他查詢,則您創建的索引應以准確的順序包括您在查詢中檢查的所有字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM