#javascript #mongodb #node.js #mongoose
#javascript #mongodb #node.js #mongoose
Вопрос:
Я использую nodejs, mongoose odm и mongo для веб-приложения и сталкиваюсь с проблемами при попытке запустить запрос в стиле «group by» в mongoose:
var results = mymodel.collection.group (
{
keyf:
function(doc)
{
var m = doc.date.getMonth();
var d = doc.date.getDate();
var y = doc.date.getFullYear();
return { date: m "/" d "/" y };
},
cond: {},
reduce: function(doc,prev) { prev.total = doc.value; },
initial: { total: 0 }
}
);
if(results == null)
{
console.log("results is nulln");
}
если я запускаю код «mymodel.collection.group» в оболочке mongo, он работает отлично. Однако в nodejs / mongoose, похоже, возвращается нулевой результат, хотя в документации mongoose указано, что прямой код mongo может быть выполнен с использованием встроенного драйвера mongo.
у кого-нибудь есть идеи, как решить?
Ответ №1:
Мне только что удалось сделать это в Mongoose. Для этого вам нужно создать связанный вызов и в обратном вызове выполнить сокращение.
var foo = function(name, callback){
Model.where('user', name).
select('points').
run(callback);
}
Итак, приведенное выше отображение, а затем уменьшение — это
foo(name, function(errors, docs){
var score = 0;
for (var i=0; i < docs.length; i ){
score = docs[i].points;
});
Это работает для моих нужд на данный момент
Ответ №2:
У меня была похожая проблема, и я мог бы сделать это с помощью aggregation framework.
mymodel.collection.aggregate(
{ $match : CONDITION },
{ $group : _id : {
year : { $year : "$date"},
month : { $month : "$date"},
day : { $dayOfMonth : "$date"}
},
count : {
$sum : 1
}
},
{ $project : {
date : {
year : "$_id.year",
month : "$_id.month",
day : "$_id.day"
}
},
{ $sort : {
"date.year" : 1,
"date.month" : 1,
"date.day" : 1
}
},
function(err, res) { ..callback function..}
);
Комментарии:
1. Пожалуйста, предоставьте объяснение вашего ответа.