代码之家  ›  专栏  ›  技术社区  ›  Ricardo Pereira

如何在mongoose模式id中设置特定值?

  •  0
  • Ricardo Pereira  · 技术社区  · 5 年前

    我需要向mongoose模式的id属性传递一个特定的值,以便关联集合。

    我试着传递_id:false,这样猫鼬就不会自动创建带有随机值的id字段。

    我写了这个模式:

    const mongoose = require('mongoose');
    
    const DetailsSchema = new mongoose.Schema({
      _id: String,
      name: String,
      value: Number
    }, {_id: false});
    
    const Details = mongoose.model('details', DetailsSchema);
    
    module.exports = Details;
    

    这是我接收特定值的路径:

    router.post('/api/newSolicitation', async (req, res) => {
    const { value, id, name } = req.body;
    const checkforid = await Details.findOne({id});
    
    if(checkforid) {
      const result = await Details.save();
      console.log('Detail updated: ', result);
    
      res.json({
        success: true,
        message: 'Detail Updated'
      });
    }
    else {
        const detail = new Details({
            id,
            name,
            value
        });
    
        const submit = await detail.save();
        console.log('New detail created:', submit);
    
        res.json({
          success: true,
          message: 'New detail created!'
        });
       }  
    });
    

    我收到了以下错误消息:

    UnhandledPromiseRejectionWarning: MongooseError: document must have an _id before saving
    

    我不明白,因为我已经声明了_id及其值。

    2 回复  |  直到 5 年前
        1
  •  0
  •   Asaf Aviv    5 年前

    您正在尝试通过搜索和创建 id 而不是 _id .

    提供 _身份证 或者让MongoDB为您生成一个文档。

    去除 { _id: false } 并提供 _身份证 在插入时,如果没有 _身份证 因为 _身份证 是复制所必需的。

    router.post('/api/newSolicitation', async (req, res) => {
      // destucture id from req.body and rename it to _id 
      // { property: newPropertyName }
      const { id: _id, name, value } = req.body;
      const checkforid = await Details.findById(_id);
    
      if(checkforid) {
        const result = await Details.save();
        console.log('Detail updated: ', result);
    
        return res.json({
          success: true,
          message: 'Detail Updated'
        });
      }
      const detail = new Details({ _id, name, value }).save();
      console.log('New detail created:', detail);
    
      res.json({
        success: true,
        message: 'New detail created!'
      });
    });