[问题]Mongoose如何实现统计查询、关联查询

 发布于 4 年前  作者 a272121742  13025 次浏览

最近业务上提出一个需求,要求能做统计,我们设计的文档集,统计可能跨越的文档会比较多,想问一下,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开发各位有没有遇见过,真心求解,谢谢!

6 回复

我遇到过。。统计查询的。后来解决办法是,扫库之后重新加了个总数的字段,每次更新都对字段进行+=操作。需要总数就取总数了。。速度还最快。。

小应用用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"
})
 

恩,populate是个好方法,尝试多次之后发现他比较严格,需要匹配完全疲惫model_name和schema_filed。中间用个忽略大小写就可以实现了

 

想问一下,三联查询怎么做? 比如A-ref-B,B-ref-C,在查A的时候把ABC都查出来

A:{
B:{
C:{
}
}
}
 

@a272121742 其实你看到StorySchema model就是作了两个关联,只不过是放在同一级,向你这个相互关联的话确实不适合用这种方法,只能通过第二种方法设计数据模型来做了,如果你强制先用mapreduce在用populate的话太耗性能了,你这么多关系数据,建议你mysql+mongodb同时使用,关系型数据用mysql包 npm install mysql require ‘mysql’,如果是要牺牲性能作为代价的话用mongodb就没有意义了

Mongoose如何实现统计查询、关联查询的更多相关文章

  1. Mysql 单表查询 子查询 关联查询

    数据准备: ## 学院表create table department( d_id int primary key auto_increment, d_name varchar(20) not nul ...

  2. 表单生成器(Form Builder)之mongodb表单数据查询——关联查询

    这一篇接着记录一下查询相关的操作.想象一下,如果想要在一张表格中展示某些车辆的耗损和营收情况,我们该怎么处理.车辆.耗损.营收各自存储在一张表中,耗损和营收中冗余了车辆信息……我们便想到了关联查询.m ...

  3. 六 一对多关联查询&关联查询小结

    一对多关联查询:基于用户表关联查询订单表 在pojo中,一的一方方式多的一方的集合 在代理映射中配置查询方法,ResultMap一对多关系(注意:当两表有字段重名时,在一方字段设置别名,以免造成查询混 ...

  4. JAVA-Unit03: SQL(基础查询) 、 SQL(关联查询)

    Unit03: SQL(基础查询) . SQL(关联查询) 列别名 当SELECT子句中查询的列是一个函数 或者表达式时,那么查询出来的结果集 中对应的该字段的名字就是这个函数或者 表达式的名字.为此 ...

  5. 01-04-03【Nhibernate (版本3.3.1.4000) 出入江湖】Criteria API关联查询

    Criteria API关联查询 如果说HQL查询还有需要了解点SQL语法知识,并不是完全彻底面向对象查询, 那么Criterial API就是完全面向对象的查询方式. public IList< ...

  6. MyBatis:学习笔记(3)——关联查询

    MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...

  7. Mybatis学习系列(五)关联查询

    前面几节的示例基本都是一些单表查询,实际项目中,经常用到关联表的查询,比如一对一,一对多等情况.在Java实体对象中,一对一和一对多可是使用包装对象解决,属性使用List或者Set来实现,在mybat ...

  8. MySQL单表查询 条件查询,分组

    目录 1 where 条件查询 between like not in 2 group by 分组 聚合函数:max min sum avg count 3 having 过滤 4 distinct ...

  9. Mongoose中的关联表查询 && 聚合查询

    注:阅读此篇文章,需要有一定的Mongo基础.基本的不会再重复介绍. 例:  有两张表,一张是博客列表,另外一张是博客的标签表.现在我们要做两张表的插入和关联查询. 创建两张表的Schema 主表bl ...

随机推荐

  1. 2014最热门、最具争议的10个Java话题

    Java 的哪些内容已在2014年死去,Java 的哪些变更又遭到整个Java社区的竭力反对?请随我们一起来回顾在2014年这个多事之秋中Java都发生了哪些变化,以及小伙伴们都在JAXenter热烈 ...

  2. 简单的 Android 拍照并显示以及获取路径后上传

    简单的 Android 拍照并显示以及获取路径后上传 Activity 中的代码,我只贴出重要的事件部分代码 public void doPhoto(View view) { destoryBimap ...

  3. ACdream 1028 Path

    先思考一下序列上应该怎么做. 如果某段和为x,并且x为偶数,那么比x小的偶数,一定是这段的子段. 如果某段和为x,并且x为奇数,那么比x小的奇数,一定是这段的子段. 因此....只要寻找最大的连续的和 ...

  4. javascript中关于this的理解

    首先看一下这几个定义 this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被视为某个对象的方法调用时,this等于那个对象. 不过,匿名函数的执行环境具有全 ...

  5. MITMF

    一. 安装 项目地址:https://github.com/byt3bl33d3r/MITMf 需要自行手动安装python-nfqueue,pefile模块 sudo apt-get install ...

  6. C#读书笔记之object类的基本方法

    The ToString() Method For example:int i = 50;string str = i.ToString(); // returns "50" He ...

  7. OMCS开发手册(02) -- 多媒体连接器

    OMCS开发手册(01) -- 多媒体设备管理器 一文,我们从Owner的角度详细描述了多媒体设备管理器的使用,本文我们将站在Guest的角度,描述OMCS中另一类组件/控件:多媒体连接器.多媒体连接 ...

  8. POCO系列之——延迟加载

    当我们进行查询的时候,哪些关系的数据将会被加载到内存呢?所有相关的对象都需要吗?在一些场合可能有意义,例如,当查询的实体仅仅拥有一个相关的子实体,但是,多数情况下,你可能只需要加载部分数据,或者你喜欢 ...

  9. mysql灵活分页存储过程

    ), -- 表名 ), -- 排序字段(必须!支持多字段不用加order by) IN _PageIndex int, -- 指定当前为第几页 IN _PageSize int, -- 每页多少条记录 ...

  10. genymotion模拟器配置X86模拟器加速器

    网上下载zip包 http://download.csdn.net/download/we5868123/9430140 直接拖进去即可,虚拟机不能使用管理员权限启动 名字为:解决genymotion ...