mongoDB 获取过滤后的总条数

问题描述

我想拿到跟query条件匹配的条目总数total,怎么拿比较好?
我现在的做法是外面再套一层查询,感觉这样不好.

db.collection('netdatas').find(query).count().then(total=>{
    db.collection('netdatas').find(query).sort(sort).skip((page - 1)*num).limit(num).toArray().then(docs=>{
    ws.send(JSON.stringify({
        cmd:"query_netdatas",
        data:{
            num,
            page,
            total,
            records:docs
        }
    }))
})
})

看了下可以用aggregation,但是沒搞定~

请问怎么比较方便拿到query过滤之后的total总条数?

阅读 2.8k
1 个回答

从数据库的角度,这就是2件完全不同的事情。道理也很简单:如果你只需要前面N条,数据库找出前面的就可以收手了。但是你要找出total,数据库就需要找出所有的符合条件的数据,后者显然要比前者重得多。但后者又只是计数,前者则是要找出真实的文档……总之,完全不同的执行计划,不可能一次查询同时得到。
如果要说改进的话,建议看看Promise,两次查询是可以同时异步执行的,不用先执行完一个再执行另外一个。
最后从设计的角度,使用这种方式在大数据场景往往是不合适的,count的效率和skip/limit的效率在数据量大的时候都不怎么样,不建议这么设计。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题