猫鼬填充功能不填充

时间:2019-09-16 11:38:42

标签: node.js mongoose

我有一个用户模式和一个任务模式。 (如下所示)

创建任务时,任务的“作者”字段将填充用户ID。但是,即使运行.populate(“ tasks”),该用户的task数组也永远不会获得任何值。

我尝试过先搜索用户,然后再填充,反之亦然。试图查看猫鼬文档,但不确定其工作原理。

用户架构

const UserSchema = new mongoose.Schema( {
    name: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true,
        trim: true,
        unique: true
    },
    email: {
        type: String,
        required: true,
        unique: true,
        validate( value ) {
            if ( !validator.isEmail( value ) ) {
                throw new Error( "Email is unvalid" );
            }
        }
    },
    tasks: [ {
        type: mongoose.Schema.Types.ObjectId,
        ref: "Task"
    } ],
    tokens: [ {
        token: {
            type: String
        }
    } ]
} );

const User = mongoose.model( "User", UserSchema, "users" );

module.exports = User;

任务架构

const TaskSchema = mongoose.Schema( {
    name: {
        type: String,
        required: true,
        unique: true
    },
    description: {
        type: String
    },
    completed: {
        type: Boolean,
        default: false
    },
    author: {
        type: mongoose.Schema.Types.ObjectId,
        ref: "User"
    }
} );

const Task = mongoose.model( "Task", TaskSchema, "tasks" );

module.exports = Task;

任务的创建(req.user._id来自中间件)

router.post( "/api/tasks", auth, async ( req, res ) => {
    const task = await new Task( {
        _id: new mongoose.Types.ObjectId(),
        name: req.body.name,
        description: req.body.description,
        author: req.user._id
    } );

    task.save( ( error ) => {
        if ( error ) {
            throw new Error( error );
        }
        if ( !error ) {
            User.find( {} ).populate( "tasks" ).exec( ( error, tasks ) => {
                if ( error ) {
                    throw new Error( error );
                }
            } );
        }
    } );
    res.send( task );
} );

当我搜索用户,然后填充任务字段,然后在console.log用户时,我得到的只是关于用户的信息,但是任务数组仍然为空。

我是按错误的顺序做某件事,还是错过了一步?

谢谢您的时间

1 个答案:

答案 0 :(得分:2)

这不会自动完成。也就是说,Mongoose将不会推送到用户的tasks数组来保存其任务的ID。您需要手动执行此操作:

user.tasks.push(task);

更多详情,请访问Refs to children