2015-07-01 2 views
0

Я использую Nodejs Expressjs MongoDB и Mongoose для создания API-интерфейса для небольшого сервис-приложения, над которым я работаю.Модель Mongoose, применяющая несколько функций к объекту модели

Я сделал все маршруты, применяющим одиночные прямые функции, такие как .find() .findOneAndUpdate() и т.д. , как это:

router.get('/testTable', function(req, res, next) { 
    TestModel.find(function (err, testTableEntries) { 
     if (err) return next(err); 
     res.send(testTableEntries); 
    }); 
}); 

Довольно просто. Но, что, если я хочу, чтобы включить больше функций, то только одну функцию, Монго .find()

Что делать, если я хочу:

.find().pretty() 

Или, если хотите, чтобы агрегировать, сделать некоторые отсчеты:

.find().count() 
.find({"fieldName": "How many have this value?"}).count() 
.find({"fieldName": "How many have this value?"}).count().pretty() 

Я пытался что-то вроде:

router.get('/testTable', function(req, res, next) { 
    TestModel.find(function (err, testTableEntries) { 
     if (err) return next(err); 
     res.send(testTableEntries); 
    }).count(); 
}); 

Или, может быть, вы можете посоветовать callbackless решение с обещанием (л икэ Bluebird), моя первая мысль:

router.get('/testTable', function(req, res, next) { 
    TestModel.find(function (err, next) { 
     if (err) return next(err); 
    }).then(function (req, res, next) { 
     res.send(testTableEntries); 
    }).catch(function (err, next) { 
     if (err) return next(err); 
    }); 
});  

Может быть, есть некоторые Mongoose встроенных функций, которые могут решить эту проблему, я буду благодарен, но также будет полезно знать, как вызвать функции в цепочке один за другой - по моделям Mongoose.

Я благодарен заранее за любые советы и мысли!

ответ

0

Ну вы всегда можете просто позвонить .count() непосредственно:

Test.count({"fieldName": "How many have this value?"},function(err,count) { 
    // count is the counted results 
}); 

И, конечно, объект, возвращаемый из `.find() в мангуста является массивом, так:

Test.find({"fieldName": "How many have this value?"},function(err,results) { 
    var count = results.length; 
}) 

Или для" цепочки»вы можете сделать это с„запросом“.count()

Test.find({"fieldName": "How many have this value?"}) 
    .count().exec(function(err,results) { 
}) 

И если вы хотите «Рассчитывает» всех возможных значений «FIELDNAME» затем использовать .aggregate():

Test.aggregate([ 
    { "$group": { 
     "_id": "fieldName", 
     "count": { "$sum": 1 } 
    }}, 
],function(err,results) { 
    // each result has a count 
}); 

Вы вообще должны начать думать в терминах «работает внутри» обратного вызова в асинхронном программировании и не «возвращение» результатов от метода вызова «внешняя» переменная.

+0

Спасибо, что сработало абсолютно нормально! Конечный код был с router.get ('/ testTable /: someFiledId', function (req, res) {Model.count ({"someFieldId": req.params.someFieldId}). Exec (function (err, count) {var jsoncount = {"count": count}; if (err) return err; res.send (jsoncount);});}); – JavaJedi