一种使用Mongoose计数带有对象ID的文档的更好方法?

时间:2019-04-11 22:37:51

标签: javascript mongodb mongoose

当前,我正在用Mongoose查询MongoDB,以搜索具有特定ObjectID的特定类别(例如5ca510c87cf5db0017a59d5d),然后在具有该特定类别的流程中对文档进行计数。但是,我想知道是否有更好的方法可以查询类别的private LocalDate birth = LocalDate.of(2000, Month. JANUARY, 0) 字段(例如“ Primary”),从而可以跨任何其他数据库工作而无需将代码修改为特定ID。

这是一个Node.js应用程序,其中Express用于MVC,Mongoose用于ODM。

我在documentation中提到了Mongoose的function maxint(a) b = 1 c = 1 while b != a c = c * 2 + 1 b = b + 1 end while return c 函数,但似乎找不到一个很好的类比。

类别模型:

name

流程模型:

populate

流程控制器:

var CategorySchema = new Schema({
    name: {type: String, required: true, min: 3, max: 100}
});

默认情况下,var ProcessSchema = new Schema( { name: {type: String, required: true}, machine: {type: Schema.Types.ObjectId, ref: 'Machine', required: true}, summary: {type: String, required: true}, serial_number: {type: String, required: true}, category: [{type: Schema.Types.ObjectId, ref: 'Category'}] } ); 所有对过程的查询都会产生如下结果:

exports.index = function(req, res) {

    async.parallel({
        ...
        process_category_primary_count: function(callback) {
            Process.countDocuments({category: '5ca510c87cf5db0017a59d5d'},callback);
        },
        process_category_intermediate_count: function(callback) {
            Process.countDocuments({category: '5ca510f57cf5db0017a59d5e'},callback);
        },
        process_category_finishing_count: function(callback) {
            Process.countDocuments({category: '5ca511017cf5db0017a59d5f'},callback);
        },
        ...
    }, function(err, results) {
        res.render('index', { title: 'Dashboard Home',
                              error: err,
                              data: results });
    });
};

因此,从本质上讲:我想使用类别“名称”而不是“ id”来搜索和计算Process集合。

1 个答案:

答案 0 :(得分:0)

我认为您必须使用$lookup才能执行此操作,因此这将是更多的代码。
根据MongoDB的文档,.countDocuments()还会进行聚合,并在您传递的查询匹配后将{ $group: { _id: null, count: { $sum: 1 } } }添加到管道的最后一个阶段。这只是复制相同的过程。
它会返回一个光标游标[{ _id: null, count: <someCount> }](-:
$unwind是将category字段从数组转换为单个记录。

Process.aggregate([
  {
    $lookup: {
      from: 'categories',
      localField: 'category',
      foreignField: '_id',
      as: 'category'
    }
  },
  { $unwind: '$category' },
  { $match: { 'category.name': 'categoryName' } },
  { $group: { _id: null, count: { $sum: 1 } } }
], callback)