You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:50:18