21

我正在尝试在我的 mongo db 中运行聚合语句。我有一个文件,其结构(至少)如下:

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

我想运行一个聚合语句,聚合给定“keywordGroupId”和给定“日期”间隔的“排名”字段。

我一直在尝试使用以下聚合命令:

{ 
    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 语句忽略了指定的日期间隔。

谁能帮我解决这个问题?

4

3 回答 3

37

删除您的字段$上的前缀:$date$match

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

仅当字段名称在值中使用时才使用$前缀,而不是作为键。

于 2013-02-22T13:56:30.767 回答
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
     }]
});

mongoose.model('storeorder',storeOrder);

现在按匹配日期聚合:--

storeOrder.aggregate([$match:{date :new Date("2016-12-26T00:00:00.000Z")} ])

**必须使用new Date("2016-12-26T00:00:00.000z"),而不是Date("2016-12-26T00:00:00.000z") because Date(your_date) !== new Date(your_date)

谢谢你

于 2016-12-25T21:43:06.117 回答
1

聚合需要一个 Javascript 日期对象,否则不起作用。

new Date();
new Date(year, month, day);

请注意月份以 0 而不是 1 开头(您的 1 月为 0 和 12 月 11 日)

于 2021-03-09T03:52:35.343 回答