Как написать группу по запросу с помощью Mongoosejs?

#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. Пожалуйста, предоставьте объяснение вашего ответа.