Javascript 计算对象ID为';他在用猫鼬吗?

Javascript 计算对象ID为';他在用猫鼬吗?,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,目前,我正在使用Mongoose查询MongoDB,以搜索具有特定ObjectID的特定类别(例如5ca510c87cf5db0017a59d5d),然后对具有该特定类别的流程中的文档进行计数。但是,我想知道是否有更好的方法可以查询category的name字段(例如“Primary”),这样它就可以跨任何其他数据库工作,而无需将代码修改为特定ID 这是一个Node.js应用程序,Express用于MVC,Mongoose用于ODM 我在中提到了Mongoose的populate函数,但似乎找不

目前,我正在使用Mongoose查询MongoDB,以搜索具有特定ObjectID的特定类别(例如5ca510c87cf5db0017a59d5d),然后对具有该特定类别的流程中的文档进行计数。但是,我想知道是否有更好的方法可以查询category的
name
字段(例如“Primary”),这样它就可以跨任何其他数据库工作,而无需将代码修改为特定ID

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

我在中提到了Mongoose的
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 });
    });
};
默认情况下,
find
过程的所有查询将产生如下结果:

{ category: [ 5c9d48508ee1353a2786c7d0 ],
    _id: 5ca3ca9a9743b52602d88c57,
    name: 'Milling-Detailing',
    machine: 5c9e407c6e0b26209b55dbbd,
    summary: 'Detailing pass for each object.',
    serial_number: '1002',
    __v: 0 }

因此,本质上:我希望使用类别“名称”而不是“id”来搜索和计算流程集合。

我认为您必须使用
$lookup
才能做到这一点,因此这将是一个相当多的代码。
根据MongoDB文档,
.countDocuments()
还进行聚合,并添加
{$group:{{u id:null,count:{$sum:1}}}
作为管道匹配传入查询后的最后一个阶段。这只是复制相同的过程。
它将返回一个一项游标
[{u id:null,count:}]
(:
$unwind
类别
字段从数组转换为单个记录

Process.aggregate([
{
$lookup:{
从:"类别",,
localField:'类别',
foreignField:“\u id”,
as:‘类别’
}
},
{$unwind:'$category'},
{$match:{'category.name':'categoryName'},
{$group:{{u id:null,计数:{$sum:1}}
],回调)

我认为您必须使用
$lookup
才能做到这一点,因此这将是一个相当多的代码。
根据MongoDB文档,
.countDocuments()
还进行聚合,并将
{$group:{{u id:null,count:{$sum:1}}}
添加为管道匹配传入查询后的最后一个阶段。这只是复制相同的过程。
它将返回一个一项游标
[{u id:null,count:}]
(:
$unwind
类别
字段从数组转换为单个记录

Process.aggregate([
{
$lookup:{
从:"类别",,
localField:'类别',
foreignField:“\u id”,
as:‘类别’
}
},
{$unwind:'$category'},
{$match:{'category.name':'categoryName'},
{$group:{{u id:null,计数:{$sum:1}}
],回调)

是的,有效!按回答添加。功能非常强大,此聚合和查找为。结果的形式为[{u id:null,count:3}]。是否有更好的方法获取准确的数字(“3”)而不是对结果进行切片(例如,结果[0]。count)你必须使用一个助手函数来实现这个功能。
aggregate
返回一个游标,它总是以数组的形式出现。好的,我试过了。我想我现在有一个工作链了。非常感谢!是的,它可以工作!作为答案添加。非常强大,这个聚合和查找是。结果是[{u id:null,count:3}]。有没有更好的方法来获取精确的数字(“3”)而不是对结果进行切片(例如,结果[0]。计数)?您必须使用辅助函数来实现这一点。
aggregate
返回一个始终以数组形式存在的光标。好的,我已经尝试过了。我想我现在有一个工作链了。非常感谢!