我有一个集合,它使用聚合来计算基于其他字段的字段,我想把它转换成一个视图。我该如何使用mongoose来实现这一点呢?
2mbi3lxu1#
用途:
MyModel.connection.db.createCollection('myViewName', { viewOn: 'existingCollection', pipeline: [/* aggregation pipeline here */] });
来源:https://github.com/Automattic/mongoose/issues/5694视图的完整文档及其示例位于:https://docs.mongodb.com/manual/reference/method/db.createView/
u4dcyp6a2#
基本上,您有一个包含模型的文件,假设它是一个Order模型,如下所示:
const Order = mongoose.model('Order', { customer_id: String, order_date: Date, product: String, quantity: Number, price: Number });
并且您希望快速计算每个订单的收入,而无需按ID或名称从数据库中查询每个订单,但是您不希望将收入存储在数据库中(例如,冗余或额外空间),因此这里提供了视图的美感。
const UserRevenueSchema = new mongoose.Schema({ _id: mongoose.Schema.Types.ObjectId, name: String, email: String, revenue: Number }, { collection: 'user_revenue', versionKey: false });
因此,使用上面定义的模式,您可以编写以下视图
Order.createCollection({ viewOn: 'orders', pipeline: [ { $lookup: { from: 'users', localField: 'user_id', foreignField: '_id', as: 'user' } }, { $unwind: '$user' }, { $group: { _id: '$user._id', name: { $first: '$user.name' }, email: { $first: '$user.email' }, revenue: { $sum: { $multiply: [ '$quantity', '$price' ] } } } } ], collation: { locale: 'en_US', strength: 2 } }, function(err) { if (err) { console.log(err); } else { console.log('View created successfully!'); } });
这将创建一个名为user_revenue的新集合作为orders集合的视图,使用我们前面定义的相同管道。如果需要,collation选项指定用于字符串比较的排序规则。现在可以将其视为mongoose中的一个新模型。因此,您可以轻松地编写:
// get all revenues sorted by email UserRevenue.find().sort({email:1})
2条答案
按热度按时间2mbi3lxu1#
用途:
来源:https://github.com/Automattic/mongoose/issues/5694
视图的完整文档及其示例位于:https://docs.mongodb.com/manual/reference/method/db.createView/
u4dcyp6a2#
基本上,您有一个包含模型的文件,假设它是一个Order模型,如下所示:
并且您希望快速计算每个订单的收入,而无需按ID或名称从数据库中查询每个订单,但是您不希望将收入存储在数据库中(例如,冗余或额外空间),因此这里提供了视图的美感。
因此,使用上面定义的模式,您可以编写以下视图
这将创建一个名为user_revenue的新集合作为orders集合的视图,使用我们前面定义的相同管道。如果需要,collation选项指定用于字符串比较的排序规则。现在可以将其视为mongoose中的一个新模型。因此,您可以轻松地编写: