名为Restaurant的架构包含isLive标志。


如何仅将包含isLive标志的餐厅返回给true

我不想在每个查询或每个聚合中都检查isLive,如下所示:

exports.getRestaurants = async (req, res) => {
  const restaurants = await Restaurant.getAllRestaurants();
  if (!restaurants) return next();
  const liveRestaurants = restaurants.filter(restaurant => restaurant.isLive);
  res.status(200).json({ restaurants: liveRestaurants });
};


我要做的是将与Restaurant架构相关的每个操作过滤为isLive = true

我试图做的是使用猫鼬钩子,但是我不知道如何基于isLive标志返回数据。

restaurantSchema.pre('aggregate', function(next) {
  console.log('pre aggregate');
  // Return data based on the isLive flag,, is it possible?
  next();
});


因此,是否可以使用钩子基于isLive标志返回值?或任何其他方式可以解决我的问题?

最佳答案

您可以在MongoDB中创建database view并将isLive添加为过滤条件。

Restaurant.db.createCollection('liveRestaurants', {
    viewOn: 'restaurants',
    pipeline: [{ $match: { isLive: true } }]
});


然后,您需要使用相同模式的另一个模型:

let Restaurant = mongoose.model('Restaurant', restaurantSchema);
let LiveRestaurant = mongoose.model('liveRestaurants', restaurantSchema, 'liveRestaurants');


而且您可以使用与查询常规模型相同的方式来查询只读模型,但它只会返回经过过滤的餐馆:

let result = await LiveRestaurant.find();

关于javascript - Mongoose ,如何基于特定的 bool 标志返回与模式相关的数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59552690/

10-10 13:07