web-dev-qa-db-ja.com

Mongo:一致集計クエリの日付が無視されているようです

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ステートメントが指定された日付間隔を無視していると想定する必要があります。

誰かがこの点で私を助けることができますか?

11
Marco

$$dateフィールドの$matchプレフィックスを削除します。

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

$接頭辞は、フィールド名がキーではなく値で使用されている場合にのみ使用します。

18
JohnnyHK

ISodateが機能しない場合があります。したがって、「1」日のみを使用して日付を一致させる場合の最適な方法は次のとおりです。---

例:-スキーマを次のようにします:---

_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)を使用する必要があります。

ありがとうございました

6
Ravi Joshi