如何在MongoDB中根据用户ID关联查询对应Todo数据?
实现用户与关联Todo数据的查询
首先需要修正你当前的Mongoose模型定义,原模型存在关联逻辑错误:
userSchema中的todo: { desc }不是集合关联的正确写法,无法关联独立的todo集合;todoSchema中的id: id无意义,Mongoose会自动为每个文档生成_id字段,无需自定义。
修正后的模型定义
const mongoose = require('mongoose'); // Todo模型:添加userId字段关联所属用户 const todoSchema = new mongoose.Schema({ desc: String, userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User' } }); const Todo = mongoose.model('Todo', todoSchema); // User模型 const userSchema = new mongoose.Schema({ name: String, email: String }); const User = mongoose.model('User', userSchema);
实现查询的两种方法
方法1:使用MongoDB聚合查询($lookup)
通过聚合的$lookup操作关联用户集合与todo集合,根据用户ID匹配对应的todo数据:
async function getUserWithTodos(userId) { const userTodos = await User.aggregate([ // 匹配目标用户 { $match: { _id: new mongoose.Types.ObjectId(userId) } }, // 关联todo集合,匹配userId与用户_id { $lookup: { from: 'todos', // 注意是todo集合的复数名称(Mongoose默认转换) localField: '_id', foreignField: 'userId', as: 'todo' // 将匹配到的todo数据存入todo数组 } } ]); // 聚合返回数组,取第一个结果(若无匹配则返回null) return userTodos[0] || null; }
方法2:使用Mongoose populate(正向关联)
如果调整User模型为存储todo的ObjectId数组(正向关联),可以用populate直接填充todo数据:
// 调整后的User模型 const userSchema = new mongoose.Schema({ name: String, email: String, todo: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Todo' }] }); // 查询方法 async function getUserWithTodos(userId) { const user = await User.findById(userId).populate('todo'); return user; }
两种方法返回的结果结构都会符合你期望的格式,包含用户基础信息及对应todo数组。
内容的提问来源于stack exchange,提问作者dmx
相关产品推荐
相关产品推荐

