【问题标题】:Mongoose one-to-many not working (Nodejs)猫鼬一对多不起作用(Nodejs)
【发布时间】:2020-07-23 19:11:37
【问题描述】:

我创建了 2 个用户(管理员和用户),并且我还为一个用户创建了许多 ToDo,但我的 ToDo 数组在我的用户架构中是空的。无法理解为什么 todo 任务没有分配给用户架构。

用户架构

var userSchema = new Schema({
    name: {
        type: String,
        required: true,
        maxlength: 30,
        trim: true
    },    
    role: {
        type: Number,
        default: 0
    },
    todos: [{
        type: Schema.Types.ObjectId,
        ref:"Todo"
    }]
});
module.exports = mongoose.model("User", userSchema)

Todo 架构

let Todo = new Schema({
    todo_heading: {
        type: String
    },
    todo_desc: {
        type: String
    },
    todo_priority: {
        type: String
    },
    todo_completed: {
        type: Boolean
    },
    user: {
        type: Schema.Types.ObjectId,
        ref:"User"
    }

})

module.exports = mongoose.model('Todo', Todo);

这是我的路线

用户路线

router.get("/user/:userId/todos", isSignedIn, isAuthenticated, getToDos)

都都路线

router.get("/", getTodos)
router.get("/:id", getUsertodos);
router.post("/user/:userId/add", addUsertodos);

用户控制器

exports.getToDos = (req, res) => {
    User.find({ _id: req.params._id })
        .populate("todos")
        .exec((err, toDo) => {
            if (err) {
                res.json(err)
            }
            res.json(toDo)
        })
}

待办事项控制器

exports.addUsertodos = (req, res) => {

    let todo = new Todo(req.body)
    todo.save((err, todo) => {
        if (err) {
            return res.status(400).json({
                error: "not saved"
            })
        }
        else {
            return res.json(todo)
        }
    })
}

【问题讨论】:

    标签: node.js mongodb mongoose-schema mongoose-populate


    【解决方案1】:

    如果您在创建用户时将新创建的 todo 的 objectId 添加到 todos 属性,它应该会按预期工作。

       //routers/todo.js
        var express = require('express');
        var router = express.Router();
        const Todo = require('../models/Todo');
        const User = require('../models/User');
        
        /* GET home page. */
        router.get('/', async function (req, res) {
          let todos = await Todo.find();
          res.json({
            todos
          });
        });
        
        router.post('/todos', async function (req, res) {
          //add todos
          let {
            todo_desc,
            todo_heading,
            todo_priority,
            todo_completed
          } = req.body;
          try {
            //NOTE: for simplicity assigning first user but you can grab it from the params
            let user = await User.findOne();
            let todo = await Todo.create({
              todo_desc,
              todo_completed,
              todo_priority,
              todo_heading,
              user: user._id
            })
            res.json({
              message: 'todo created successfully',
              todo
            });
          } catch (err) {
            return res.status(500).json({
              message: 'Unable to create a todo',
              err: JSON.stringify(err)
            })
          }
        
        });
        
        module.exports = router; 
    

    这里是用户路由,post路由获取创建ID的字符串id并将其转换为ObjectId(),分配给待办事项。

    var express = require('express');
    var router = express.Router();
    let _ = require('lodash');
    var mongoose = require('mongoose');
    
    
    const User = require('../models/User');
    /* GET users listing. */
    
    
    router.post("/", async function (req, res) {
      let {
        name,
        todos
      } = req.body;
    
      try {
        let user = new User();
        user.name = name;
        let objectIds = todos.split(',').map(id => mongoose.Types.ObjectId(id));
        user.todos.push(...objectIds)
        await user.save()
        console.log("user: ", JSON.stringify(user));
        if (_.isEmpty(user)) {
          res.status(500).json({
            message: 'unable to create user'
          })
        }
        res.json(user);
      } catch (err) {
        res.status(500).json({
          message: 'unable to create user',
          err: JSON.stringify(err)
        })
      }
    });
    
    router.get("/", async function (req, res) {
      try {
        let user = await User.find().populate('todos');
        console.log("user: ", JSON.stringify(user));
        if (_.isEmpty(user)) {
          res.status(500).json({
            message: 'unable to find user'
          })
        }
        res.json(user);
      } catch (err) {
        res.status(500).json({
          message: 'unable to find user',
          err: JSON.stringify(err)
        })
      }
    });
    
    module.exports = router;
    

    查看随附的屏幕截图,用户记录现在包含分配给它的待办事项。

    如果您想查看工作代码,请访问我创建的 repo!!。

    希望有帮助。干杯!!

    【讨论】:

    • 感谢您的回复,但我的方法有所不同,请检查我的repo 并重新发送要完成的修改。提前致谢
    • 我的方法是第一个用户注册,然后登录,然后创建一个 Todo 任务,所以最初他的 Todo 是空的,然后当他添加 todo 时,它应该在他的 ID 下进入他的 todo,但是代码你写的和我的方法不一样
    • @LochanSS 请查看github.com/saroj990/mongoose-relation-assignment。检查 todo 控制器 addTodo() 和用户控制器 addTodosToUser()。我还更新了路线以具有适当的命名空间。结帐 app.js。最后,如果您觉得这有帮助,请点赞并接受我的回答。谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-02-03
    • 2018-03-03
    • 2021-06-22
    • 2023-03-03
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多