Я кодирую приложение, используя AngularJS, NodeJS и Mongoose. Теперь я делаю диаграмму, и мне нужно вернуть некоторые данные, передающие некоторые параметры. Но агрегация не работает. У меня этот запрос работает в MongoDB:
var user = db.getCollection('users').find(
{profile: "SUPERVISOR"},{_id: 1}).map(function(u){return u._id;}
)
db.getCollection("visitas").aggregate(
{ '$match':
{ createdAt:
{ '$gte': ISODate('2015-01-10T00:00:00.000Z'),
'$lt': ISODate('2015-07-01T00:00:00.000Z') } } }, { '$group':
{ _id: { usuario: user, dia: [Object] },
visitas: { '$sum': 1 } } }
)
Когда я пытаюсь запустить тот же запрос в своем приложении с помощью Mongoose, запрос не работает. Проблема, которую я видел, заключается в том, что запятая между MATCH и GROUP исчезает. Когда я пытаюсь выполнить поиск только с группой или совпадением, запрос работает. Кто-то может мне помочь? Это код приложения:
.then(function (listaUsuarios){
var argsVisit;
console.log({ $match : { "createdAt" : { $gte: "2015-01-10T00:00:00.000Z", $lt: "2015-07-01T00:00:00.000Z" }} },
{ $group : { _id : { "usuario" : listaUsuarios , "dia" : { $dayOfMonth : "$createdAt" } }, "visitas" : { $sum : 1 } } });
Visita.aggregate({ $match : { "createdAt" : { $gte: "2015-01-10T00:00:00.000Z", $lt: "2015-07-01T00:00:00.000Z" }} },
{ $group : { _id : { "usuario" : listaUsuarios , "dia" : { $dayOfMonth : "$createdAt" } }, "visitas" : { $sum : 1 } } })
.exec(function (err, results) {
if (err) {
console.log("Erro!!!");
deferredDados.reject({
error: 500,
message: 'Erro buscando Visita, erro: '+err
});
} else {
if (!results || results.length == 0) {
console.log("Sem retorno!!!");
deferredDados.resolve( [0,0,0,0,0,0,0] ); //Tudo zerado poruqe não há retorno.
//deferredDados.resolve(0);
deferredDados.reject({
error: 500,
message: 'Erro buscando Visitas, não achou resultados'
});
} else {
console.log("Dados"+results);
deferredDados.resolve( results );
//deferredDados.resolve( results.data] );
}
}
});
return deferredDados.promise;
})
РЕШИТЬ !!!
Один из членов моей команды обнаружил ошибку! \o/Возможно, это поможет кому-то, у кого будет такая же проблема.
Чтобы решить, вам просто нужно преобразовать дату в строке в тип даты.
Решенный код приведен ниже:
.then(function (listaUsuarios){
var argsVisit;
if (tipoVisita == 'N'){
argsVisit = {'user' : { "$in" :listaUsuarios }, 'tipo' : { "$in" : ["2001","2002"] }, "createdAt": {"$gte": dataInicial, "$lt": dataFinal }};
} else if (tipoVisita == 'R'){
argsVisit = {'user' : { "$in" :listaUsuarios }, 'tipo' : { "$in" : ["2005"] }, "createdAt": {"$gte": dataInicial, "$lt": dataFinal }};
} else if (tipoVisita == 'I'){
argsVisit = {'user' : { "$in" :listaUsuarios }, 'tipo' : { "$in" : ["2003"] }, "createdAt": {"$gte": dataInicial, "$lt": dataFinal }};
}
var initDate = new Date('2015-04-02T00:00:00.000Z');
var endDate = new Date('2015-05-09T00:00:00.000Z');
argsMatch = [{ $match : { "createdAt" : { $gte: initDate, $lt: endDate }} },
{ $group : { _id : { "usuario" : listaUsuarios , "dia" : { $dayOfMonth : "$createdAt" } }, "visitas" : {$sum : { $cond: [ {$or : [ { $eq: [ "$tipo", "2001"] },{ $eq: [ "$tipo","2002"] }] },1,0 ]}}}
}]
Visita.aggregate(argsMatch)
.exec(function (err, results) {
if (err) {
console.log("Erro!!!");
deferredDados.reject({
error: 500,
message: 'Erro buscando Visita, erro: '+err
});
} else {
if (!results || results.length == 0) {
console.log("Sem retorno!!!");
deferredDados.resolve( [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] ); //Tudo zerado poruqe não há retorno.
//deferredDados.resolve(0);
deferredDados.reject({
error: 500,
message: 'Erro buscando Visitas, não achou resultados'
});
} else {
deferredDados.resolve( results );
}
}
});
return deferredDados.promise;
})
.then(function(dados) {
res.json(dados);
})
.catch(function(fallback) {
console.log('Erro no retorno dos usuarios!!!');
console.log(fallback);
});
Надеюсь, это поможет кому-то.