使用knex.js/bookshelf.js获取计数结果

使用knex.js/bookshelf.js获取计数结果,bookshelf.js,knex.js,Bookshelf.js,Knex.js,我正在尝试用knex执行一个简单的计数(因为看起来)。以下代码正在运行: bookshelf.knex('hosts')。count('id')。然后(函数总数){ res.send({ 元:{ 总计:总计[0]['count(`id`)'] } }); }); 我觉得奇怪的是,我必须做total[0]['count('id')]]才能得到实际结果。我在这里做事吗 谢谢 来自knex.js的所有结果都是数组。查询可能成功,只返回0个结果 此外,您还可以在列名中直接为列别名(或count()ca

我正在尝试用knex执行一个简单的计数(因为看起来)。以下代码正在运行:

bookshelf.knex('hosts')。count('id')。然后(函数总数){
res.send({
元:{
总计:总计[0]['count(`id`)']
}
});
});
我觉得奇怪的是,我必须做
total[0]['count('id')]]
才能得到实际结果。我在这里做事吗


谢谢

来自knex.js的所有结果都是数组。查询可能成功,只返回0个结果

此外,您还可以在列名中直接为列别名(或
count()
call)。像这样:

  bookshelf.knex('hosts').count('id as CNT').then(function(total) {
    res.send({
      meta: {
        total: total[0].CNT
      }
    });
  });

仍然需要获取第一个元素,但您可以将该列作为普通JSON属性引用。

虽然knex以数组的形式返回结果,但它也有一个返回第一个结果的方法,第一个结果将是一个对象,而不是数组。直接获取计数非常简单,无需依赖[0]或任何东西即可访问数组中的计数。例如,更清洁的解决方案可以是:

bookshelf
  .knex("hosts")
  .count("id")
  .first()
  .then(function(total) {
    res.send({
      meta: {
        total: total.count
      }
    });
  });

这似乎是正确的工作,是有点简单

knex('Quotes').count('quoteBody')
    .then((res)=>{
        //console.log("rows "+JSON.stringify(res))        
        console.log("rowspl2 "+res[0]['count(`quoteBody`)'])
    })
    .catch((err)=>{
        console.log("err "+err)
    })
或者像这样试试

    knex('Quotes').count('quoteBody', {as: 'rows'})
        .then((res)=>{
           // console.log("rows "+JSON.stringify(res))
            console.log("rowsp "+res[0]['rows'])
        })
        .catch((err)=>{
            console.log("err "+err)
        })
节点js的代码

let result = await knex.count("id").from('events').first();
if (result) {
console.log(result.count);
}  

太好了,谢谢你的澄清!别名似乎是提高代码可读性的好方法。谢谢,为什么knexjs这么奇怪?似乎基本返回一个直接数字。这问得太多了吗?(回答晚了?:)Knex是基于SQL构建的,查询返回一行行结果。因此,在使用
count(“col”)的SQL查询中,
将返回一行,通常是一个名为“count”的列(可以是别名)。因为Knex是围绕SQL构建的,所以查询总是返回一个对象数组(行),其属性与列匹配。可以为
.count()
或其他返回单个值的对象设置一个特殊情况,但实际上它们只是聚合器,您可以在同一个查询中有几个(甚至
.groupBy()
不同的列,在这种情况下,您将有与组一样多的行,每个行都有自己的计数)@clay如果我想计算column1='someValue',该怎么写呢?对于任何“特殊”的东西,你都可以使用
knex.raw
,比如
knex.raw('sum(当“column1”='someValue\'然后1 else 0结束时的情况)作为“total”