虽然不能实时执行此操作,但可以使用MongoDB1.8+map/Reduce中的“Reduction”Out选项多次运行map-Reduce将数据合并到一起(请参见http:/www.monGodb.org/Display/DOCS/MapReduce#MapReduce-Outputoptions)。您需要在这两个集合中都有一些可以用作_id的键。

例如,假设您有一个users收藏和comments集合,您希望有一个新的集合,其中包含每个评论的一些用户统计信息。

比方说users集合具有以下字段:_id

首名

LASTNAME

国家

性别

年龄

然后comments集合具有以下字段:_id

用户标识

评语

创造

您可以执行此映射/还原:var mapUsers, mapComments, reduce;db.users_comments.remove();// setup sample data - wouldn't actually use this in productiondb.users.remove();db.comments.remove();db.users.save({firstName:"Rich",lastName:"S",gender:"M",country:"CA",age:"18"});db.users.save({firstName:"Rob",lastName:"M",gender:"M",country:"US",age:"25"});db.users.save({firstName:"Sarah",lastName:"T",gender:"F",country:"US",age:"13"});var users = db.users.find();db.comments.save({userId: users[0]._id, "comment": "Hey, what's up?", created: new ISODate()});db.comments.save({userId: users[1]._id, "comment": "Not much", created: new ISODate()});db.comments.save({userId: users[0]._id, "comment": "Cool", created: new ISODate()});// end sample data setupmapUsers = function() {

var values = {

country: this.country,

gender: this.gender,

age: this.age    };

emit(this._id, values);};mapComments = function() {

var values = {

commentId: this._id,

comment: this.comment,

created: this.created    };

emit(this.userId, values);};reduce = function(k, values) {

var result = {}, commentFields = {

"commentId": '',

"comment": '',

"created": ''

};

values.forEach(function(value) {

var field;

if ("comment" in value) {

if (!("comments" in result)) {

result.comments = [];

}

result.comments.push(value);

} else if ("comments" in value) {

if (!("comments" in result)) {

result.comments = [];

}

result.comments.push.apply(result.comments, value.comments);

}

for (field in value) {

if (value.hasOwnProperty(field) && !(field in commentFields)) {

result[field] = value[field];

}

}

});

return result;};db.users.mapReduce(mapUsers, reduce, {"out": {"reduce": "users_comments"}});db.comments.mapReduce(mapComments, reduce, {"out": {"reduce": "users_comments"}});db.users_comments.find().pretty(); // see the resulting collection

此时,您将有一个名为users_comments它包含合并的数据,现在可以使用该数据。这些减少的集合都有_id在映射函数中发出的键,然后所有的值都是value键-这些值不在这些简化文档的顶层。

这是一个有点简单的例子。您可以使用更多的集合重复这一点,就像您希望继续构建减少的集合一样。您还可以在此过程中对数据进行汇总和汇总。您可能会定义多个REPLE函数,因为聚合和保存现有字段的逻辑变得更加复杂。

您还将注意到,现在每个用户都有一个文档,其中包含了数组中所有该用户的注释。如果我们合并的数据具有一对一的关系,而不是一对多的关系,那么它将是平坦的,您可以简单地使用这样的约简函数:reduce = function(k, values) {

var result = {};

values.forEach(function(value) {

var field;

for (field in value) {

if (value.hasOwnProperty(field)) {

result[field] = value[field];

}

}

});

return result;};

如果你想把users_comments集合,因此它是每个注释的一个文档,另外运行以下命令:var map, reduce;map = function() {

var debug = function(value) {

var field;

for (field in value) {

print(field + ": " + value[field]);

}

};

debug(this);

var that = this;

if ("comments" in this.value) {

this.value.comments.forEach(function(value) {

emit(value.commentId, {

userId: that._id,

country: that.value.country,

age: that.value.age,

comment: value.comment,

created: value.created,

});

});

}};reduce = function(k, values) {

var result = {};

values.forEach(function(value) {

var field;

for (field in value) {

if (value.hasOwnProperty(field)) {

result[field] = value[field];

}

}

});

return result;};db.users_comments.mapReduce(map, reduce, {"out": "comments_with_demographics"});

这种技术绝对不应该在飞行中执行。它适合于cron作业或类似于定期更新合并数据的任务。你可能会想要跑ensureIndex在新集合上,以确保对其执行的查询运行迅速(请记住,您的数据仍在value键,所以如果要索引comments_with_demographics评论created时间,应该是db.comments_with_demographics.ensureIndex({"value.created": 1});

mongodb数据合并设计_MongoDB:如何将来自多个集合的数据合并成一个.?相关推荐

  1. mongodb数据合并设计_MongoDB:将来自多个集合的数据合并成一个

    我如何(在MongoDB)将来自多个集合的数据合并到一个集合? 我可以使用map-reduce,如果是这样,怎么样? 我会非常感谢一些例子,因为我是一个新手. 虽然你不能做这个实时,你可以运行map- ...

  2. 数据可视化设计经验分享:10分钟做出炫酷数据大屏

    又快到年终了,数据大屏作为一个数据管理的分析工具,在年底数据大屏的制作需求日益增加.在一些公司比如银行.证券.医院.外贸等"数据大户",在数据大屏的应用上更是有大量需求. 在接下来 ...

  3. 服务端mysql数据存储设计_服务端开发指南与最佳实战 | 数据存储技术 | MySQL(03) 如何设计索引...

    改善性能最好的方式,就是通过数据库中合理地使用索引,换句话说,索引是提高 MySQL 数据库查询性能的主要手段.在下面的章节中,介绍了索引类型.强制索引.全文索引. 基本索引类型 MySQL 索引可以 ...

  4. 数据产品设计的3个方法论

    写这篇小文主要是因为这几年总是阴错阳差地与数据打着不大不小的交道,也是想总结一下自己对数据产品的一些思考和认识,看看自己是否真的适合在这条路上一直走下去. 何谓数据产品 按照惯例,第一次听说数据产品这 ...

  5. JAVA 数据权限设计

    数据权限设计 序言 在各种系统中,要保证数据对象的安全性以及易操作性,使企业的各业务部门.职能部门能够方便而且高效的协同工作,那么一个好的数据权限管理设计就成为一个关键的问题.虽然企业中各个单元的工作 ...

  6. 想做数据可视化设计,那你必须要知道这几件事

    "混乱和混乱不是数据的属性-它们是设计的缺点."-爱德华·塔夫特 数据可视化故名思议:以某种示意图的形式来表现经过分析处理后的数据信息. 换句话说,这是一种视觉上传达一定数据内容信 ...

  7. mongodb数据合并设计_「时间序列数据」和MongoDB(二)-模式设计最佳实践

    在上一篇博客文章时间序列数据与MongoDB:第一部分-简介中,我们介绍了时间序列数据的概念,然后介绍了一些可以用于帮助收集时间序列应用程序需求的发现问题.对这些问题的回答有助于指导支持大容量生产应用 ...

  8. mongodb golang 批量更新_Mongodb读取数据缓慢问题-Sparkamp;Mongodb

    问题 在我现在工作的集群环境上,读取基础表(30.6MB,47106条数据),耗时10秒,在另一个组(叫B组)吧,我的叫A组吧,的集群环境上耗时1毫秒.从mongodb的操作来看,其操作数超过了140 ...

  9. mongodb 用户 设计_MongoDB 是什么?看完你就知道了

    点击上方蓝色字体,选择"置顶公众号" 优质文章,第一时间送达 链接 | blog.csdn.net/hayre/article/details/80628431 1.MongoDB ...

最新文章

  1. Captaris Workflow 6.0 EventService 执行效率低下的排除。
  2. android Camera2
  3. tree树的展示,check树的展示,json数据转zree树格式数据
  4. 印度孟买机器人餐厅_宝莱坞机器人2.0:重生归来一起来看印度神片!
  5. 笔记:用EXCEL计算收益(复利)
  6. gitlab project项目迁移
  7. AntiSamy测试
  8. SDM For Face Alignment 流程介绍及Matlab代码实现之训练篇
  9. 私钥经过哈希计算可以产生公钥_「区块链基础概念100」:公钥和私钥 | 027
  10. 电路维修(信息学奥赛一本通-T1448)
  11. ERP产品销售发货判断库存功能(四十二)
  12. 63.1拓展之box-shadow属性
  13. php move函数,php – 在null上调用成员函数move()
  14. 视频编码格式——h264优点
  15. 高校毕业生就业信息管理系统的设计与实现(Spring + Spring MVC +Hibernate)
  16. 【刷爆LeetCode】七月算法集训(14)栈
  17. USB 驱动程序(转贴)
  18. 树莓派上编写串口助手软件
  19. 搜索框的代码css,css搜索框_精美css搜索框代码
  20. 虚拟机(VMware Workstation或Hyper-V)装ghost版系统提示“ntldr is missing Press Ctrl+Alt+del to Resta

热门文章

  1. halcon的仿射变换算子的介绍
  2. 计算机网络测试两个主机连通性,计算机网络试卷A
  3. qstringlist格式怎么写到txt_进阶能力 | 一招解决TXT电子书乱码问题
  4. (原創) 將map輸出到cout,是否有更方便的方法? (C/C++) (STL)
  5. ThinkPHP5.0中Redis的使用和封装
  6. JavaScript中的递归
  7. ubuntu 16.04 更新后搜狗输入法无法输入中文的问题
  8. linux 系统相关服务解释
  9. 周立波贼经典的话1-10
  10. DB2 V8,V9并存在同一 server 的处理