bookshelf.js计数方法

时间:2014-01-28 12:38:50

标签: node.js bookshelf.js

我正在搜索高低,以找到如何使用Bookshelf.js进行基本计数(如SELECT COUNT(something)FROM table),但无济于事。有什么我想念的吗?或者它只是与手动选择查询一起使用?

谢谢!

6 个答案:

答案 0 :(得分:15)

现在这是一个手动查询......例如:

bookshelf.knex(tableName).count('columnName').then(...

关于为什么会出现这种情况的长篇故事,但这主要是因为关系中的一些复杂因素,我不想仅仅为了暂时把它放在那里而工作一半。 ......最终的解决方案是:

model.query().count(column).then(...

但是目前这会改变knex查询构建器实例,因此不能正常工作。我一直在研究knex的大型重构,我希望在不久的将来实现这一点。

答案 1 :(得分:3)

以下是我目前用于从模型中执行以下操作的格式:

var Sample = bookshelf.Model.extend({
  tableName: 'example',

  count: function (cb) {
    bookshelf.knex('example')
      .count('id')
      .then(function (count) {
        cb(null, count)
      })
      .catch(function (err) {
        cb(err)
      })
  }
})

现在,要计算此表,只需调用

即可
new Sample().count(function(err, result) {
    console.log(result)
});

答案 2 :(得分:1)

这是一个非常简单的解决方案,只需使用 Bookshelf.knex.raw(' count(id)作为计数')

ReactionsDb
    .query(function(qb) {
      qb.groupBy('reaction_type');
    })
    .fetchAll({columns: ['reaction_type', Bookshelf.knex.raw('count(id) as count')]});

答案 3 :(得分:1)

从版本0.8.2开始,您只需使用Collection#count()方法:

User.collection().count().then(function(count) {
  // count === 15
})

这可用于任何集合,例如模型的关系:

User.forge({id: 1}).related('comments').count().then(function(count) {
  // count === 16
})

它也可以在Model类上用作静态方法:

User.count().then(function(count) {
  // count === 15
})

它还接受一个列名,通过排除值为NULL的行来过滤计数结果,并考虑任何其他已定义的查询约束:

User.count('is_active').then(function(count) {
  // count === 8
})

User.where('status', 'single').count().then(function(count) {
  // count === 4
})

答案 4 :(得分:0)

//user.js
var db = require('./db');
var User = db.Model.extend({  
  tableName: 'users',
  hasTimestamps: true,
});
module.exports = User; 

//main.js
var User = require('./user');
User.where('pet', 'dog').count('*').then(function(count) {
  console.log("Total Count : " , count);
});

在上面的代码段中,User是一个具有petname等属性的模型。

生成的查询如下:select count(*) from user where pet='dog';

答案 5 :(得分:0)

User.collection().query(function (qb) {
  qb.join('courses', 'users.id', 'courses.user_id');
  qb.groupBy('users.id');
  qb.select("users.*");
  qb.count('* as course_count');
  qb.orderBy("course_count", "desc");
})