Marco
Marco

Reputation: 273

Why are dates in match aggregate query being ignored?

I'm trying to run an aggregation statement in my mongo db. I have a document whose structure is (at least) as follows:

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

I would like to run an aggregation statement that aggregates the 'ranking' field for a given 'keywordGroupId' and a given 'date' interval.

I have been trying with the following aggregate command:

{ 
    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" } } }
    ]
}

This command executes without errors and returns a result. If I try to change the value for the 'keywordGroupId' field, the command returns a different value, so I assume that the $match statement works for that field (NumberLong). Though, if I change the 'date' range and I specify a time interval for which I don't have any data in the database, it still returns a result (I would actually expect an empty result set). So I have to assume that the $match statement is ignoring the date interval specified.

Can anyone help me with this point?

Upvotes: 27

Views: 99767

Answers (3)

Ravi Joshi
Ravi Joshi

Reputation: 661

Sometimes ISodate does not works . so in Case if you want to match date using only "one" date the best way is:---

ex:-- Let a schema be:---

    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);

now to aggregate by matching date :--

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

**It is must to use new Date("2016-12-26T00:00:00.000z") instead of Date("2016-12-26T00:00:00.000z") because Date(your_date) !== new Date(your_date).

THANK YOU

Upvotes: 7

The aggregate expects a Javascript Date Object and doesn't work otherwise.

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

Please note the month start with 0 and not 1 (Your January is 0 and December 11)

Upvotes: 2

JohnnyHK
JohnnyHK

Reputation: 311835

Remove the $ prefix on the $date field of your $match:

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

You only use the $ prefix when the field name is used in a value, not as a key.

Upvotes: 51

Related Questions