Javascript 计算对象ID为';他在用猫鼬吗?
目前,我正在使用Mongoose查询MongoDB,以搜索具有特定ObjectID的特定类别(例如5ca510c87cf5db0017a59d5d),然后对具有该特定类别的流程中的文档进行计数。但是,我想知道是否有更好的方法可以查询category的Javascript 计算对象ID为';他在用猫鼬吗?,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,目前,我正在使用Mongoose查询MongoDB,以搜索具有特定ObjectID的特定类别(例如5ca510c87cf5db0017a59d5d),然后对具有该特定类别的流程中的文档进行计数。但是,我想知道是否有更好的方法可以查询category的name字段(例如“Primary”),这样它就可以跨任何其他数据库工作,而无需将代码修改为特定ID 这是一个Node.js应用程序,Express用于MVC,Mongoose用于ODM 我在中提到了Mongoose的populate函数,但似乎找不
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
返回一个始终以数组形式存在的光标。好的,我已经尝试过了。我想我现在有一个工作链了。非常感谢!