Mongoose自定义查询构建器

时间:2016-06-21 16:02:20

标签: node.js mongodb mongoose

我想在Mongoose做类似的事情。有可能吗?

// defining schema:
Product.queryBuilder.category = function(category) {
  return this.find({category: category});
}

Product.queryBuilder.available = function() {
  return this.find({availableQuantity: {$gt: 0}});
}

Product.queryBuilder.recent = function(count) {
  return this.sort({updatedAt: -1}).limit(count);
}


// in controller:
Product.query.category('men').available().recent(10).exec().then(...)

2 个答案:

答案 0 :(得分:0)

不,这根本不起作用。

  1. 您需要决定是否要使用mongoose实例方法或静态。如果您正在使用实例方法,则必须首先从数据库中检索文档。执行此操作时,可以在其上调用任何实例方法。并且,在所有实例方法中,您将引用this作为您的文档。

  2. 但是,如果您想使用mongoose静态,则不会通过this引用该文档。相反,您首先必须从该静态内部执行Model.find(或将检索到的doc作为param传递给static),然后才能对其执行操作。

  3. 我的建议是你把它变成一个静态的,你传递静态的查询元素和查询限制,让静态做一个带有传递参数的Product.find,并让它在回调或承诺中返回给你检索到的文件。

答案 1 :(得分:0)

由于没有可用的解决方案,我创建了自己的解决方案。

https://github.com/gberger/mongoose-named-scopes

https://www.npmjs.com/package/mongoose-named-scopes