MongoDB多表關(guān)聯(lián)查詢操作實(shí)例詳解
本文實(shí)例講述了MongoDB多表關(guān)聯(lián)查詢操作。分享給大家供大家參考,具體如下:
Mongoose的多表關(guān)聯(lián)查詢
首先,我們回憶一下,MySQL多表關(guān)聯(lián)查詢的語句:
student表:

calss表:

通過student的classId關(guān)聯(lián)進(jìn)行查詢學(xué)生名稱,班級(jí)的數(shù)據(jù):
SELECT student.name,student.age,class.name FROM student,class WHERE student.classId = class.id
Mongoose多表聯(lián)合查詢(還是以眾所周知的學(xué)生、班級(jí)作為實(shí)例)
· 表結(jié)構(gòu)的定義(schemas目錄下)
1. student表(student.js)
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
/*定義數(shù)據(jù)模式*/
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()
}
}
/*更新時(shí)間的*/
});
module.exports = StudentSchema;
2. class表(class.js)
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
/*定義數(shù)據(jù)模式*/
var ClassSchema = new mongoose.Schema({
name: String,
meta: {
createAt: {
type: Date,
default: Date.now()
},
updateAt: {
type: Date,
default: Date.now()
}
}
/*更新時(shí)間的*/
});
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);
/*導(dǎo)出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);
/*導(dǎo)出Class模型 模塊*/
module.exports = Class;
· Model進(jìn)行數(shù)據(jù)的查詢操作
1. 將靜態(tài)類的方法加到Model的編譯中
StudentSchema.static = {
fetch: function(cb){
return this
.find({})
.sort('meta.updateAt') //按更新的時(shí)間排序
}
}
2. 將靜態(tài)類方法加到Model中
StudentSchema.static('fetch', function(cb){
return this
.find({}, cb)
.sort('meta.updateAt')
})
3. 直接調(diào)用model的find()方法
查詢的結(jié)果均為:
[
{
_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'
}
]
· 多表聯(lián)合查詢(學(xué)生對應(yīng)班級(jí))
StudentSchema.static = {
findStudentWithClass: function (cb) {
return this
.find({})
.populate('classId')//注意這是聯(lián)合查詢的關(guān)鍵
.sort('meta.updateAt')
.exec(cb)
}
}
查詢結(jié)果:
[
{
_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班'
}
}
]
· 由上面的實(shí)例可知,mongoose的多表聯(lián)合查詢的關(guān)鍵:
1. 數(shù)據(jù)模式結(jié)構(gòu)定義需要利用關(guān)鍵字ref定義關(guān)聯(lián)
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數(shù)據(jù)庫程序設(shè)計(jì)有所幫助。
相關(guān)文章
JavaScript按日期查詢MongoDB中的數(shù)據(jù)的要點(diǎn)示例
這篇文章主要介紹了JavaScript按日期查詢MongoDB中數(shù)據(jù)的要點(diǎn)示例,MongoDB所支持的BSON有JSON沒有的一些數(shù)據(jù)類型,如Date和BinData類型,需要的朋友可以參考下2016-03-03
使用aggregate在MongoDB中查詢重復(fù)數(shù)據(jù)記錄的方法
這篇文章主要介紹了使用aggregate在MongoDB中查詢重復(fù)數(shù)據(jù)記錄的方法的相關(guān)資料,需要的朋友可以參考下2016-01-01
MongoDB自動(dòng)刪除過期數(shù)據(jù)的方法(TTL索引)
這篇文章主要給大家介紹了關(guān)于MongoDB自動(dòng)刪除過期數(shù)據(jù)(TTL索引)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11
Mongodb過濾器filter選擇要返回的數(shù)組子集操作方法
Mongodb使用過濾器 $filter根據(jù)指定條件選擇要返回的數(shù)組子集,這篇文章主要介紹了Mongodb對嵌套文檔數(shù)組進(jìn)行查詢操作,需要的朋友可以參考下2023-07-07
Centos7 yum安裝mongodb實(shí)現(xiàn)步驟詳解
這篇文章主要介紹了Centos7 yum安裝mongodb實(shí)現(xiàn)步驟詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Mongodb 數(shù)據(jù)類型及Mongoose常用CURD
MongoDB 是一個(gè)開源的 NoSQL 數(shù)據(jù)庫,相比 MySQL 那樣的關(guān)系型數(shù)據(jù)庫,它更為輕巧、靈活,非常適合在數(shù)據(jù)規(guī)模很大、事務(wù)性不強(qiáng)的場合下使用,本文給大家介紹Mongodb 數(shù)據(jù)類型及Mongoose常用CURD,感興趣的朋友一起學(xué)習(xí)吧2016-01-01

