mongodb 实现join

mongodb提供ref和populate的方法,支持类似join的SQL操作。本文给出一个实际的例子:

1. 数据1:

var daob = new Schema({

    user: {
        type: String
    },
    title: {
        type: String
    },
    tag: [{
        type: String
    }],
    content: {
        type: String
    },
    count: {
        type: Number,
        ‘default‘:0
    }
});

2. 数据2:

var daoa = new Schema({

    name: {
        type: String
    },
    time: {
        type: Date
    },
    conments: [{
        type: mongoose.Schema.ObjectId, //这里保存daob的id,mongo中只能使用collection的_id
        ref: ‘daob‘
    }]
});

3. 插入操作:

var b = new daobmodel({
        user: ‘fredric‘,
        title: ‘title1‘,
        tag: [‘tag1‘, ‘tag2‘, ‘tag3‘],
        content: ‘nothing to say, just test‘,
    });

    b.save(function(err) {
        var a = new daoamodel({
            name: ‘sinny‘,
            time: new Date(),
            conments: [b._id]
        });

        a.save(function(err) {
            return callback(err);
        })
    });

4. 查找操作:

mongo不支持真正意义上的join操作,因此本例中的需求只能分拆成两步

//这里可以采用聚合来实现比较复杂的查询
    daobmodel.find({
        ‘tag‘: {
            $in: [‘tag1‘]
        }
    }, {
        _id: 1
    }, function(err, ids) {
        daoamodel.find({
            conments: {
                $in: ids
            }
        }).populate(‘conments‘).exec(function(err, docs) {
            return callback(err, docs);
        });
    });
时间: 2024-08-08 08:44:38

mongodb 实现join的相关文章

MySQL与MongoDB的区别

一.MongoDB简介 什么是MongoDB ?MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统.在高负载的情况下,添加更多的节点,可以保证服务器性能.MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成.MongoDB 文档类似于 JSON 对象.字段值可以包含其他文档,数组及文档数组. 主要特点MongoDB的提供了一个面向文档存储,操作起来比较简单和容易.你可以在

MongoDB和MySQL的区别

前言: MySQL与MongoDB都是开源的常用数据库,但是MySQL是传统的关系型数据库,MongoDB则是非关系型数据库,也叫文档型数据库,是一种NoSQL的数据库.它们各有各的优点,关键是看用在什么地方.所以我们所熟知的那些SQL语句就不适用于MongoDB了,因为SQL语句是关系型数据库的标准语言. 一.关系型数据库-MySQL 1.在不同的引擎上有不同的存储方式.2.查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高.3.开源数据库的份额在不断增加,mysql的份额页在持续

报表工具的二次革命之集算器的作用

之前的文章已经大致给大家介绍过大数据计算引擎-润乾集算器了.想必很多人心里还是存在疑惑,集算器作为大数据分析系统,到底它能做些什么?这篇文章,就为大家详细介绍. 降低报表开发难度 降低开发难度从而提高开发效率是集算器的设计初衷,是最容易理解的作用,前面已有粗略介绍. 这方面的细节内容太多,我们会再做一个专门话题详细讲述集算器如何解决报表开发中的各种具体难题以及与常规手段的对比.在这里只做总结性地阐述. 比Java和SQL更易写 如前所述,集算器的设计目标是为了解决报表的数据准备,而目前这个工作一

Mongoose指南 - Population

MongoDB没有join, 但是有的时候我们需要引用其它collection的documents, 这个时候就需要populate了. 我们可以populate单个document, 多个document, plain object, multiple plain objects或query返回的全部object. var mongoose = require('mongoose'); var Schema = mongoose.Schema; var personSchema = new S

在MongoDB中使用JOIN操作

SQL与NoSQL最大的不同之一就是不支持JOIN,在传统的数据库中,SQL JOIN子句允许你使用普通的字段,在两个或者是更多表中的组合表中的每行数据.例如,如果你有表books和publishers,你可以像下面这样写命令: SELECT book.title, publisher.name FROM book LEFT JOIN book.publisher_id ON publisher.id; 换句话说,book表中的publisher_id字段引用了publishers表中的id字典

报表示例——用Jasper report实现MongoDB join

多样性数据源是报表开发的常见问题,但用JasperReport等报表工具本身难以处理,比如展现两个MongoDB collection连接的结果.虽然JasperReport有virtual data source或table join,但这些功能只在商业版或高端版本出现,在免费版中实现的难度很大.而且这些功能只支持两个数据源的连接,要实现多连接则麻烦得多.另外,这些功能只是图形化界面,无法对连接后的数据进行类似SQL的结构化计算. 集算器具有结构化强计算引擎,支持多样性数据源,集成简单,可以协

用Jasper Report制作Mongodb join Mysql的报表例子

多样性和多数据源问题使用JasperReport等报表工具本身不易处理,比如展现MongoDB和mysql的混合运算.虽然JasperReport/Birt有virtual data source或table join等功能,但只在商业版或高端版本出现,在免费版中实现难度很大,而且功能也有较大局限,无法对连接后的数据进行类似SQL的结构化计算. 集算器具有结构化强计算引擎,支持多样性数据源,集成简单,可以协助报表工具方便地实现此类需求.下面通过一个例子来说明MongoDB join mysql的

MongoDB 学习笔记之 Aggregation Pipeline实战实现inner join

 Aggregation Pipeline实战实现inner join: leftT集合: comments集合: 现在我们要用aggregation实现inner join db.comments.aggregate([{ $lookup: { from:"leftT", localField:"timestamp", foreignField:"timestamp", as: "timestampCol" }}, {$un

MongoDB快速学习1

从我第一次听到Nosql这个概念到如今已经走过4个年头了,但仍然没有具体的去做过相应的实践.最近获得一段学习休息时间,购买了Nosql技术实践一书,正在慢慢的学习.在主流观点中,Nosql大体分为4类,键值存储数据库,列存储数据库,文档型数据库,图形数据库.今天主要快速的浏览了文档型数据库中目前市场占有率的最高的MongoDB数据库.记得初次见到和关注这个数据库还是我刚来上海的时候,公司将该数据库作为新建的项目管理系统的后台数据库,当时还是很向往的,只是无缘参与那个项目,也就一直没有和该数据库打