我有一個集合在具有這種結構的用戶文檔:
{ "_id" : ObjectId("4fb54ef46d93b33b21003951"),
"activities" : [
{ "id" : ObjectId("4fd66f9001e7fe9f03000065"),
"type" : "checkin",
"date_time_created" : Date(1339453328000)},
{ "date_time_created" : Date(1337351732000),
"date_time_updated" : Date(1337351952635),
"id" : ObjectId("4fb65e346d93b3fe77000000")}
]
}
我可以輕鬆地查詢基於日期這些文件:
User.where(
:activities => {
'$elemMatch' => {
:date_time_created => { '$gte' => start_date, '$lt' => end_date }
}
}
).length
根據日誌:
MOPED:127.0。 0.1:27017 COMMAND database = db command = {:count =>「users」,:query => {「activities」=> {「$ elemMatch」=> {「date_time_created」=> {「$ gte」=> 05-10 00:00:00 UTC,「$ lt」=> 2012-07-12 00:00:00 UTC}}}}}(0.5260ms)
我得到了我需要的結果。
然而,當我試圖使用基於同一標準的新的聚合函數和$匹配:
User.collection.aggregate([
{ "$match" => {
:activities => {
'$elemMatch' => {
:date_time_created => { '$gte' => start_date, '$lt' => end_date }
}
}
} }
]).length
根據日誌:
MOPED:127.0.0.1:27017命令管理= db命令= {:aggregate =>「users」,:pipeline => [{「$ match」=> {:activities => {「$ elemMatch」=> {「date_time_created」=> {「$ gte」=> 「2012年5月10日星期四」,「$ lt」=> Thu,2012年7月12日}}}}}]}(0.6049ms)
「start_date」和「end_date」是Ruby Date對象, h查詢。但是,當我查看日誌時,它們會變成不同的格式。當我嘗試強制使用類似start_date.strftime(「%Y-%m-%d」)的格式時,它仍然不起作用。
集合管道中還有其他函數,但是我把它們取出來了,但仍然出現錯誤。
我如何獲得聚合函數在日期上匹配?
你不需要$ elemMatch在這裏 - 你可以刪除它,看看這是否會改變發生了什麼? $ elemMatch用於比較數組元素的兩個不同屬性,這裏是測試單個值。 –