[英]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.