ti-enxame.com

Mongo: as datas na consulta agregada da correspondência parecem ser ignoradas

Estou tentando executar uma declaração de agregação no meu mongo db. Eu tenho um documento cuja estrutura é (pelo menos) a seguinte:

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

Gostaria de executar uma declaração de agregação que agrega o campo 'ranking' para um determinado 'keywordGroupId' e um determinado intervalo de 'data'.

Eu tenho tentado com o seguinte comando agregado:

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

Este comando é executado sem erros e retorna um resultado. Se eu tentar alterar o valor do campo 'keywordGroupId', o comando retornará um valor diferente, portanto, presumo que a instrução $ match funcione para esse campo (NumberLong). No entanto, se eu alterar o período 'date' e especificar um intervalo de tempo para o qual não tenho dados no banco de dados, ele ainda retornará um resultado (eu realmente esperaria um conjunto de resultados vazio). Portanto, devo assumir que a instrução $ match está ignorando o intervalo de datas especificado.

Alguém pode me ajudar com esse ponto?

11
Marco

Remova o $ prefixo no $date campo do seu $match:

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

Você usa apenas o $ prefixo quando o nome do campo é usado em um valor, não como uma chave.

18
JohnnyHK

Às vezes, o ISodate não funciona. no caso, se você deseja combinar a data usando apenas a data "uma", a melhor maneira é: ---

ex: - Seja um esquema: ---

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

agora para agregar por data correspondente: -

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

** É necessário usar new Date("2016-12-26T00:00:00.000z") em vez de Date("2016-12-26T00:00:00.000z") because Date(your_date) !== new Date(your_date).

OBRIGADO

6
Ravi Joshi