通常不同集合的数据之间是有关系的,列如文章信息和用户信息存储在不同集合中,但文章是某个用户发表的,要根据文章的 作者id 获取作者信息,就要用到集合关联
使用id进行关联
使用populate方法进行关联查询
文章集合
let Article = mongoose.model('article',new mongoose.Schema({
title:{
type:String,
required:[true,'文章标题不能为空']
},
author:{
// 使用ID将文章和作者集合进行关联
type: mongoose.Schema.Types.ObjectId,
// 关联的集合
ref: 'auth',
required:[true,'文章作者不能为空'],
},
content:String,
}))
用户集合
let Auth = mongoose.model('auth',new mongoose.Schema({
name:{
type:String,
required:[true,'name不能为空']
},
age:Number,
hobbies:{
type:[String],
default:[]
},
}))
查询
// 查询关联数据
Article.find().populate('author').then(res=>{
console.log("关联数据",res)
})
示例
/**
* 集合关联查询示例
*
* */
const mongoose = require('mongoose')
const app = require('express')()
// 连接数据库
mongoose.connect('mongodb://localhost/article',{useUnifiedTopology: true,useNewUrlParser: true}).then(
res=>console.log("连接成功")
,err=>{
console.log("连接失败",err)
})
// 发布模型
let Article = mongoose.model('article',new mongoose.Schema({
title:{
type:String,
required:[true,'文章标题不能为空']
},
author:{
// 使用ID将文章和作者集合进行关联
type: mongoose.Schema.Types.ObjectId,
// 关联的集合
ref: 'auth',
required:[true,'文章作者不能为空'],
},
content:String,
}))
// 发布模型
let Auth = mongoose.model('auth',new mongoose.Schema({
name:{
type:String,
required:[true,'name不能为空']
},
age:Number,
hobbies:{
type:[String],
default:[]
},
}))
// 添加测试数据
// Auth.create([
// {name:"用户1",age:18,hobbies:['敲代码']},
// {name:"用户2",age:18,hobbies:['敲代码']},
// {name:"用户3",age:18,hobbies:['敲代码']},
// {name:"用户4",age:18,hobbies:['敲代码','1']},
// ]).then(res=>console.log('添加成功'))
// findArr()
// async function findArr(){
// let auths = await Auth.find()
// let arr = []
// auths.forEach((item,i)=>{
// arr.push({title:"文章标题"+i,author:item._id,content:'文章内容'+i})
// })
// // 用户数据的_id
// // 添加文章数据
// Article.create(arr).then(res=>console.log('文章添加成功'))
// }
// 查询关联数据 文章1的用户关联数据
Article.find({title:"文章标题1"}).populate('author').then(res=>{
console.log("关联数据",res)
})
app.listen(3000,()=>{
console.log("mongoose测试 服务器启动")
})
查询内容