2013-02-22 81 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