2013-02-22 104 views
2

我想在我的mongo數據庫中運行聚合語句。我有其結構是(至少)如下文檔:Mongo:匹配聚合查詢中的日期似乎被忽略

{ 
    "_id": ObjectId, 
    "date": ISODate, 
    "keywordGroupId": NumberLong, 
    "ranking": NumberLong, 
} 

我想運行聚合的「排名」字段對於給定的聚合語句「keywordGroupId」和給定的「日期」的時間間隔。

我一直在試圖與以下aggregate命令:

{ 
    aggregate : "KeywordHistory", 
    pipeline : [ 
     { $match: { keywordGroupId: 75 , "$date": {$gte: ISODate("2013-01-01T00:00:00.0Z"), $lt: ISODate("2013-02-01T00:00:00.0Z")}} }, 
     { $group: { _id: { null }, count: { $sum: "$ranking" } } } 
    ] 
} 

這個命令執行沒有錯誤並返回結果。如果我嘗試更改'keywordGroupId'字段的值,該命令將返回不同的值,因此我假設$ match語句對該字段(NumberLong)有效。但是,如果我更改'日期'範圍,並指定數據庫中沒有任何數據的時間間隔,它仍會返回一個結果(我實際上期望得到一個空的結果集)。所以我必須假定$ match語句忽略指定的日期間隔。

任何人都可以幫助我解決這個問題嗎?

回答

5

$match$date場取下$前綴:

{ $match: { 
    keywordGroupId: 75, 
    date: {$gte: ISODate("2013-01-01T00:00:00.0Z"), $lt: ISODate("2013-02-01T00:00:00.0Z")} 
}}, 

你只使用$前綴時,字段名的值時,不作爲重點。

+0

我已經嘗試過沒有'$',但它不工作。實際上,如果我刪除它,查詢總是返回一個空的結果集(即使我使用數據庫中的日期間隔)。 – Marco 2013-02-22 14:11:01

+0

我希望包含以下兩個文檔:「{date:」ISODate(「2013-01-06T00:00:00.0Z」), 「keywordGroupId」{ 「_id」:ObjectId(「511e2dca73ff275f250002e9」), 「:NumberLong(75), 」排名「:NumberLong(13) }和{ 」_id「:的ObjectId(」 511e2dca73ff275f250002e8 「), 」keywordGroupId「:NumberInt(75), 」日期「:ISODate(」 2013-01-15T00:00:00。0Z 「), 」排行榜「:NumberInt(11) }' – Marco 2013-02-22 14:21:51

+0

雖然,我不希望在我的結果下列之一:'{ 」_id「:物件(」 511e2dca73ff275f250002e8" ), 「keywordGroupId」: NumberInt(75), 「date」:ISODate(「2012-12-16T00:00:00.0Z」), 「ranking」:NumberInt(11) }'如果我運行上面的聚合命令日期),它也返回上面的文檔,即使它不應該被包含,因爲日期不在期望/表達的時間範圍內。 – Marco 2013-02-22 14:23:50

0

有時候ISodate不起作用。所以,如果如果你想只用「一」迄今爲止最好的方式來匹配日期:---

例如: - 讓一個模式是:---

var storeOrder = new Schema({ 
store_name:{type:String, required:true}, 
date :{type:Date ,default:moment(new Date()).format('YYYY-MM-DD')}, 
orders : [{ 
vegetable : String, 
quantity : Number, 
price:Number 
}] 

});

mongoose.model('storeorder',storeOrder);

現在通過匹配日期彙總: -

storeOrder.aggregate([$比賽:{日期,新的日期( 「2016-12-26T00:00:00.000Z」)}])

由於日期(your_date)!==必須使用新Date(「2016-12-26T00:00:00.000z」)而不是Date(「2016-12-26T00:00:00.000z」)新日期(your_date)。

THANK YOU