如何使用mongoose创建mongodb视图

z5btuh9x  于 2023-02-23  发布在  Go
关注(0)|答案(2)|浏览(239)

我有一个集合,它使用聚合来计算基于其他字段的字段,我想把它转换成一个视图。我该如何使用mongoose来实现这一点呢?

2mbi3lxu

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/

u4dcyp6a

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})

相关问题