Mongoose如何实现统计查询、关联查询
最近业务上提出一个需求,要求能做统计,我们设计的文档集,统计可能跨越的文档会比较多,想问一下,mongoose能实现统计查询和关联查询吗? 例如student文档对象有subject文档对象,subject文档对象有score属,查询所有学员的成绩。我个人的思路就是一般的解决方案,先查询所有学员,再查询所有分数,然后遍历做累加统计
StudentDao.find().select('_id').exec(function(err,stus){
SubjectDao.find().where('student_id').in(stus).exec(function(err,subs){
var sum = 0;
for(var i = 0; i < subs.length; i++){
sum += subs[i].score;
}
console.log(sum);
});
});
心想只要提供了关联查询和统计查询,这样的代码会变得简化,不知道熟悉mongoose或者做过mongodb开发各位有没有遇见过,真心求解,谢谢!
我遇到过。。统计查询的。后来解决办法是,扫库之后重新加了个总数的字段,每次更新都对字段进行+=操作。需要总数就取总数了。。速度还最快。。
小应用用mapreduce吧。不过效率挺低的了。还是做增量好些。。无论啥数据库- -。
######mongoose api手册的统计的方法:
Kitten.where('color', 'black').count(function (err, count) {
if (err) return handleError(err);
console.log('there are %d black kittens', count);
})
地址:http://mongoosejs.com/docs/api.html#query_Query-count mongodb作是文件型数据库,作关联并没有什么优势.我列出其中一些方法你可以参考一下:
##一:通过mongodb的mapreduce进行查询 优点是没有数据冗余或数据不一致问题,并且不需多次查询。缺点是mongodb的mapreduce基于javascript引擎(目前是spider monkey),单线程运行,所以效率略差,不适合实时查询 ##二:通过良好的设计数据模型来做到
var postSchema = new Schema({
author : {type : String},
title : {type : String, require : true},
content : {type : String, require : true},
comment : {
owner : {type : String},
subject : {type: String, require},
content : {type String, require}
}
});
myPostModel.find({ 'comment.subject' : /car*/ }).exec(function(err, result){
Do some stuff with the result...
});
对了,补充一下,还有用ref做关联,例如:
var mongoose = require('mongoose')
, Schema = mongoose.Schema
var PersonSchema = new Schema({
name : String,
age : Number,
stories : [{ type: Schema.Types.ObjectId, ref: 'Story' }]
});
var StorySchema = new Schema({
_creator : { type: Schema.Types.ObjectId, ref: 'Person' },
title : String,
fans : [{ type: Schema.Types.ObjectId, ref: 'Person' }]
});
var Story = mongoose.model('Story', StorySchema);
var Person = mongoose.model('Person', PersonSchema);
#关联查询
Story
.findOne({ title: /timex/ })
.populate('_creator')
.exec(function (err, story) {
if (err) return handleError(err);
console.log('The creator is %s', story._creator.name); // prints "The creator is Aaron"
})
@a272121742 其实你看到StorySchema model就是作了两个关联,只不过是放在同一级,向你这个相互关联的话确实不适合用这种方法,只能通过第二种方法设计数据模型来做了,如果你强制先用mapreduce在用populate的话太耗性能了,你这么多关系数据,建议你mysql+mongodb同时使用,关系型数据用mysql包 npm install mysql require ‘mysql’,如果是要牺牲性能作为代价的话用mongodb就没有意义了
Mongoose如何实现统计查询、关联查询的更多相关文章
- Mysql 单表查询 子查询 关联查询
数据准备: ## 学院表create table department( d_id int primary key auto_increment, d_name varchar(20) not nul ...
- 表单生成器(Form Builder)之mongodb表单数据查询——关联查询
这一篇接着记录一下查询相关的操作.想象一下,如果想要在一张表格中展示某些车辆的耗损和营收情况,我们该怎么处理.车辆.耗损.营收各自存储在一张表中,耗损和营收中冗余了车辆信息……我们便想到了关联查询.m ...
- 六 一对多关联查询&关联查询小结
一对多关联查询:基于用户表关联查询订单表 在pojo中,一的一方方式多的一方的集合 在代理映射中配置查询方法,ResultMap一对多关系(注意:当两表有字段重名时,在一方字段设置别名,以免造成查询混 ...
- JAVA-Unit03: SQL(基础查询) 、 SQL(关联查询)
Unit03: SQL(基础查询) . SQL(关联查询) 列别名 当SELECT子句中查询的列是一个函数 或者表达式时,那么查询出来的结果集 中对应的该字段的名字就是这个函数或者 表达式的名字.为此 ...
- 01-04-03【Nhibernate (版本3.3.1.4000) 出入江湖】Criteria API关联查询
Criteria API关联查询 如果说HQL查询还有需要了解点SQL语法知识,并不是完全彻底面向对象查询, 那么Criterial API就是完全面向对象的查询方式. public IList< ...
- MyBatis:学习笔记(3)——关联查询
MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...
- Mybatis学习系列(五)关联查询
前面几节的示例基本都是一些单表查询,实际项目中,经常用到关联表的查询,比如一对一,一对多等情况.在Java实体对象中,一对一和一对多可是使用包装对象解决,属性使用List或者Set来实现,在mybat ...
- MySQL单表查询 条件查询,分组
目录 1 where 条件查询 between like not in 2 group by 分组 聚合函数:max min sum avg count 3 having 过滤 4 distinct ...
- Mongoose中的关联表查询 && 聚合查询
注:阅读此篇文章,需要有一定的Mongo基础.基本的不会再重复介绍. 例: 有两张表,一张是博客列表,另外一张是博客的标签表.现在我们要做两张表的插入和关联查询. 创建两张表的Schema 主表bl ...
随机推荐
- java基础值进制转换
十进制转换为二进制: 解: 十进制数42连续除以2,当被除数为0时停止除以2,将余数倒加即为结果 :42(10)=101010(2) 注: 计算机内部表示数的字节单位是定长的,且只能是字节(1byte ...
- SQLite安装
SQLite 的一个重要的特性是零配置的,这意味着不需要复杂的安装或管理.本章将讲解 Windows.Linux 和 Mac OS X 上的安装设置. 一.在Windows上安装SQLite 访问SQ ...
- android项目实战 --ListView 头部ViewPager广告轮询图效果
看开源框架:https://github.com/tianshaojie/AndroidFine,里面有如下效果,特记录学习下,以后项目中用也好能够立刻想起来. 如上面所示,是常见项目中的图片轮训 ...
- ACdream 1015 Double Kings
假设第一个人选的点为P,并且当作根,那么第二个人选的最优情况必然是根p连着的那些点中的一个.然后枚举一下P即可. #pragma comment(linker, "/STACK:102400 ...
- JS的一些常见验证代码
1//檢查空串 2function isEmpty(str){ 3 if((str == null)||(str.length == 0)) return (true); 4 else retu ...
- strpos 返回0时 ,比较false 不能加单引号
$a = 'a.approve'; $num = strpos($a,'a.admin'); if(strpos($a,'a.approve') !== 'false'){ //不能加单引号.变字符 ...
- IOS中实例的权限控制
@public.@protected.@private的使用 在OC中声明一个类的时候,可以使用上面 @public.@protected.@private三个关键字声明实例的权限,例如下面的代码: ...
- linux之sed命令
原命令行: sudo sed -i 's/${storm.home}\/logs\/var\/log\/storm/g' /usr/share/storm/log4j/storm.log.proper ...
- PHP中try{}catch{}的具体用法详解
PHP中try{}catch{}是异常处理,将要执行的代码放入TRY块中,如果这些代码执行过程中某一条语句发生异常,则程序直接跳转到CATCH块中,由$e收集错误信息和显示.任何调用 可能抛出异常的方 ...
- vc中主线程等待子线程退出的方法
VC线程同步,在子线程中等待另一子线程结束,通过WaitForSingleObject可以实现,但是如果在主线程中等待子线程结束,这个函数是无法完成要求的,因为它会造成主线程挂起,导致程序死掉.我们可 ...