MongoDB多表关联查询操作实例详解

本文实例讲述了MongoDB多表关联查询操作。分享给大家供大家参考,具体如下:

Mongoose的多表关联查询

首先,我们回忆一下,MySQL多表关联查询的语句:

student表:

calss表:

通过student的classId关联进行查询学生名称,班级的数据:

SELECT student.name,student.age,class.name FROM student,class WHERE student.classId = class.id

Mongoose多表联合查询(还是以众所周知的学生、班级作为实例)

· 表结构的定义(schemas目录下)

1. student表(student.js)

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
/*定义数据模式*/
var StudentSchema = new mongoose.Schema({
  name: String,
  calssId: {
    type: Schema.Types.objectId,
    ref: 'class'
  },
  age: Number,
  number: Number,
  meta: {
    createAt: {
      type: Date,
      default: Date.now()
    },
    updateAt: {
      type: Date,
      default: Date.now()
    }
  }
  /*更新时间的*/
});
module.exports = StudentSchema;

2. class表(class.js)

var mongoose = require('mongoose');
var Schema = mongoose.Schema;
/*定义数据模式*/
var ClassSchema = new mongoose.Schema({
  name: String,
  meta: {
    createAt: {
      type: Date,
      default: Date.now()
    },
    updateAt: {
      type: Date,
      default: Date.now()
    }
  }
  /*更新时间的*/
});
module.exports = ClassSchema;

· 生成Model(model目录下)

1. student Model(student.js)

var mongoose = require('mongoose');
var StudentSchema = require('../schemas/student');
/*通过model编译模式为模型*/
var Student = mongoose.model('student', StudentSchema);
/*导出Student模型 模块*/
module.exports = Student;

2. class Model(class.js)

var mongoose = require('mongoose');
var ClassSchema = require('../schemas/class');
/*通过model编译模式为模型*/
var Class = mongoose.model('class', ClassSchema);
/*导出Class模型 模块*/
module.exports = Class;

· Model进行数据的查询操作

1. 将静态类的方法加到Model的编译中

StudentSchema.static = {
  fetch: function(cb){
 return this
   .find({})
   .sort('meta.updateAt') //按更新的时间排序
  }
}

2. 将静态类方法加到Model中

StudentSchema.static('fetch', function(cb){
   return this
     .find({}, cb)
  .sort('meta.updateAt')
})

3. 直接调用model的find()方法

查询的结果均为:

[
    {
        _id: '5a05222f583e5720b8660191',
        name: '张三',
        age: 18,
        number: 11,
        classId: '5a0036512b740f32e4371e66'
    },
    {
        _id: '5a05222f583e5720b8660091',
        name: '李四',
        age: 19,
        number: 11,
        classId: '5a0036512b740f32e1371e66'
    },
    {
        _id: '5a05222f583e5720b18660191',
        name: '赵五',
        age: 17,
        number: 11,
        classId: '5a0036512b7420f32e4371e66'
    }
]

· 多表联合查询(学生对应班级)

StudentSchema.static = {
  findStudentWithClass: function (cb) {
    return this
      .find({})
      .populate('classId')//注意这是联合查询的关键
      .sort('meta.updateAt')
      .exec(cb)
  }
}

查询结果:

[
    {
        _id: '5a05222f583e5720b8660191',
        name: '张三',
        age: 18,
        number: 11,
        classId: {
            _id: '5a0036512b740f32e4371e66',
            name: '一年1班'
        }
    },
    {
        _id: '5a05222f583e5720b8660091',
        name: '李四',
        age: 18,
        number: 11,
        classId: {
            _id: '5a0036512b740f32e1371e66',
            name: '二年2班'
        }
    },
    {
        _id: '5a05222f583e5720b18660191',
        name: '赵五',
        age: 18,
        number: 11,
        classId: {
            _id: '5a0036512b7420f32e4371e66',
            name: '一年2班'
        }
    }
]

· 由上面的实例可知,mongoose的多表联合查询的关键:

1. 数据模式结构定义需要利用关键字ref定义关联

var Schema = new mongoose.Schema({
  field: {
 type: mongoose.Schema.Type.ObjectId,
 ref: 'model'
  }
});
Schema.static = {
  fetch: function(cb){
 return this
    .find({})
    .populate('field')
    .exec(cb)
 }
 }
var Model = mongoose.Model('model',Schema );

希望本文所述对大家MongoDB数据库程序设计有所帮助。

(0)

相关推荐

  • Mongodb实现的关联表查询功能【population方法】

    本文实例讲述了Mongodb实现的关联表查询功能.分享给大家供大家参考,具体如下: Population MongoDB是非关联数据库.但是有时候我们还是想引用其它的文档.这就是population的用武之地. Population是从其它文档替换文档中的特定路径.我们可以迁移一个单一的文件,多个文件,普通对象,多个普通的对象,或从查询中返回的所有对象 populate 方法 populate 方法可以用在 document 上. model 上或者是 query 对象上,这意味着你几乎可以在任

  • MongoDB的基础查询和索引操作方法总结

    查询操作 1.查询所有记录 db.userInfo.find(); 相当于: select* from userInfo; 2.查询去掉后的当前聚集集合中的某列的重复数据 db.userInfo.distinct("name"); 会过滤掉name中的相同数据 相当于: select disttince name from userInfo; 3.查询age = 22的记录 db.userInfo.find({"age": 22}); 相当于: select * f

  • MongoDB如何对数组中的元素进行查询详解

    前言 MongoDB是文档型数据库,每个文档(doc)表示数据的一项记录.相比关系型DB的row只能使用简单的数据类型,doc能够使用复杂的数据类型:内嵌doc,数组.MongoDB的数组是一系列元素的集合,使用中括号 [] 表示数组,例如:[1,2,3]的元素是整数值,[{name:"t5"}, {name:"t7"}],[ {name:"t5", age:21}, {name:"t7", age:22} ]的元素是doc.

  • MongoDB下根据数组大小进行查询的方法

    注意:作者使用的mongodb版本为2.4.7. 首先插入测试数据 复制代码 代码如下: db.data.insert({name:'a', num:[12,123,22,34,1]});db.data.insert({name:'b', num:[42,22]});db.data.insert({name:'c', num:[49]}); 键num对应的值是数组. 查询num的数组值具有指定大小的document 最好的方法是使用$size,例如指定大小为2,可以: 复制代码 代码如下: db

  • MongoDB各种查询操作详解

    一.find操作 MongoDB中使用find来进行查询,通过指定find的第一个参数可以实现全部和部分查询. 1.查询全部 空的查询文档{}会匹配集合的全部内容.如果不指定查询文档,默认就是{}. 2.部分查询 3.键的筛选 键的筛选是查询时只返回自己感兴趣的键值,通过指定find的第二个参数来实现.这样可以节省传输的数据量,又能节省客户端解码文档的时间和内存消耗. 查询时,数据库所关心的查询文档的值必须是常量. 二.查询条件 1.比较查询 $lt,$lte,$gt,$gte,$ne和<,<

  • MongoDB查询操作限制返回字段的方法

    映射(projection )声明用来限制所有查询匹配文档的返回字段.projection以文档的形式列举结果集中要包含或者排除的字段.可以指定要包含的字段(例如:{field:1})或者指定要排除的字段(例如:{field:0}).默认_id是包含在结果集合中的,要从结果集中排除_id字段,需要在projection中指定排除_id字段({_id:0}).除了_id字段,不能在一个projection中联合使用包含和排除语意. 返回匹配文档的所有字段: 如果没有指定projection,fin

  • MongoDB查询性能优化验证及验证

    结论: 1. 200w数据,合理使用索引的情况下,单个stationId下4w数据.mongodb查询和排序的性能理想,无正则时client可以在600ms+完成查询,qps300+.有正则时client可以在1300ms+完成查询,qps140+. 2. Mongodb的count性能比较差,非并发情况下client可以在330ms完成查询,在并发情况下则需要1-3s.可以考虑估算总数的方法,http://blog.sina.com.cn/s/blog_56545fd30101442b.htm

  • MongoDB中多表关联查询($lookup)的深入讲解

    一.  聚合框架 聚合框架是MongoDB的高级查询语言,它允许我们通过转换和合并多个文档中的数据来生成新的单个文档中不存在的信息. 聚合管道操作主要包含下面几个部分: 命令 功能描述 $project 指定输出文档里的字段. $match 选择要处理的文档,与fine()类似. $limit 限制传递给下一步的文档数量. $skip 跳过一定数量的文档. $unwind 扩展数组,为每个数组入口生成一个输出文档. $group 根据key来分组文档. $sort 排序文档. $geoNear

  • PHP中MongoDB数据库的连接、添加、修改、查询、删除等操作实例

    PHP 扩展mongon.mod.dll下载http://cn.php.net/manual/en/mongo.installation.php#mongo.installation.windows 然后php.ini添加 extension=php_mongo.dll 最后phpinfo() 查找到 表标PHP已经自带了mongo功能,你就可以操作下面的代码(但是你必须有安装mongodb服务器) 一.连接数据库 使用下面的代码创建一个数据库链接 复制代码 代码如下: <?php $conne

  • MongoDB查询技巧总结

    在MongoDB中db.collection.find()方法用于从集合中检索文档.db.collection.find()方法返回一个检索到文档的游标.db.collection.findOne()方法也执行读操作,返回一条文档.在内部实现上,db.collection.findOne()方法是db.collection.find()使用limit 1. 查询集合中的所有文档: 1.一个空的query文档({})可以查出一个集合中的所有文档: 复制代码 代码如下: db.inventory.f

  • mongodb实现同库联表查询方法示例

    前言 最近在工作中遇到一个问题,需要对mongodb数据库进行联表查询操作,发现网上这方面的资料较少,无奈只能自己来实现了,下面话不多说了,来一起看看详细的介绍: 注意:这里只对同库联表查询做介绍,跨库联表查询可能在之后也会介绍(因为公司架构变动,之后可能会联表查询) 我用到的联表查询有两种,一种是mongoose的populate,一种是$lookup 一.populate populate是使用外键关联子表 例如现在有一张订单表结构(动态外键): var orderSchema = new

  • MongoDB导出查询结果到文件例子

    dump.js 复制代码 代码如下: var c = db.user.find({nick_name:{$exists:true,$ne:''}}).limit(100); while(c.hasNext()) {     printjson(c.next()); } mongo 192.168.2.201:41211/dc_user dump.js > feed.json dc_user库的user表的指定数据会以json形式保存在feed.json中. 注意:printjson输出的是格式化

随机推荐