MongoDB 集合关联 获取关联数据

通常不同集合的数据之间是有关系的,列如文章信息和用户信息存储在不同集合中,但文章是某个用户发表的,要根据文章的 作者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测试 服务器启动")
})

查询内容
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值