当前,我正在用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集合。
答案 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)