Mar*_*rco 8 mongodb aggregation-framework
我正在尝试在我的mongo db中运行聚合语句.我有一个文件,其结构(至少)如下:
{
"_id": ObjectId,
"date": ISODate,
"keywordGroupId": NumberLong,
"ranking": NumberLong,
}
Run Code Online (Sandbox Code Playgroud)
我想运行一个聚合语句,它聚合给定'keywordGroupId'和给定'date'间隔的'ranking'字段.
我一直在尝试使用以下聚合命令:
{
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" } } }
]
}
Run Code Online (Sandbox Code Playgroud)
此命令执行时没有错误并返回结果.如果我尝试更改'keywordGroupId'字段的值,则该命令返回不同的值,因此我假设$ match语句适用于该字段(NumberLong).但是,如果我更改'date'范围并且我指定了数据库中没有任何数据的时间间隔,它仍然会返回一个结果(我实际上会期望一个空的结果集).所以我必须假设$ match语句忽略指定的日期间隔.
任何人都可以帮助我这一点吗?
Joh*_*yHK 12
删除你$的$date字段上的前缀$match:
{ $match: {
keywordGroupId: 75,
date: {$gte: ISODate("2013-01-01T00:00:00.0Z"), $lt: ISODate("2013-02-01T00:00:00.0Z")}
}},
Run Code Online (Sandbox Code Playgroud)
您只$在字段名称用于值时使用前缀,而不是键.
小智 5
有时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
}]
Run Code Online (Sandbox Code Playgroud)
});
mongoose.model('storeorder',storeOrder);
Run Code Online (Sandbox Code Playgroud)
现在按匹配日期进行汇总:-
storeOrder.aggregate([$match:{date :new Date("2016-12-26T00:00:00.000Z")} ])
Run Code Online (Sandbox Code Playgroud)
**必须使用new Date("2016-12-26T00:00:00.000z")代替Date("2016-12-26T00:00:00.000z") because Date(your_date) !== new Date(your_date)。
谢谢
| 归档时间: |
|
| 查看次数: |
37461 次 |
| 最近记录: |