如何将数据保存到 mongodb 中的子文档中?我正在将农场子文档转换为 null

Posted

技术标签:

【中文标题】如何将数据保存到 mongodb 中的子文档中?我正在将农场子文档转换为 null【英文标题】:How to save data into sub-document in mongodb?Mine is converting farm sub-doc into null 【发布时间】:2019-10-30 18:10:17 【问题描述】:

我在用户中为农场保存数据,但我尝试了很多方法来将数据保存到农场。我创建了一个注册用户并保存数据的 api,农场是它的对象之一,我想添加注册到该特定用户后的农场。最近我尝试更新,我的代码将农场转换为 null。一个用户可以拥有许多农场。

我正在使用猫鼬、快递和护照进行身份验证。我已将农场更改为 Object、ObjectID、Array 但没有任何帮助,每次农场都转换为 null。我的架构是否正确?

架构

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

//Device Schema
const Device = new Schema(

  modelNumber: 
    type: String,
    required: true
  ,
  deviceType: 
    type: String,
    required: true
  ,
  description:
      type:String,
      required:false   
  ,

  deviceLocation:[ 
    
      latitude:Number,
      longitude:Number
    
  ],

  AddedDate: 
    type: Date,
    default: Date.now
  ,

);

// User Schema
const UserSchema = new Schema(
  name: 
    type: String,
    required: true
  ,
  email: 
    type: String,
    required: true,
  ,
  password: 
    type: String,
    required: true
  ,
  location:
      type:String,
      required:true
  ,
  createdDate: 
    type: Date,
    default: Date.now
  ,

  farm:[
      
        _id:mongoose.Schema.Types.ObjectId,
        description:String,
        farmAddDate:type:Date,default:Date.now,
        device:[Device]
     
 ]   

);


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

添加农场 API

//@route POST api/user/addFarm
//@desc POST Register Farm
//@access Public  
addFarm=function (req,res)
  User.findOneAndUpdate( farm: req.body.farm ).then(farm => 
    if (farm) 
      return res.status(400).json( farm: "Farm already exists" );
     else 
      const newFarm =  Farm(
       _id:req.body._id,
       description:req.body.description,
       device:req.body.device
      );
      newFarm
      .save()
      .then(farm => res.json(farm))
      .catch(err => console.log(err));
    
  );

  router.post('/addFarm',addFarm);

注册新用户

router.post("/register", (req, res) => 
  // Form validation
  const  errors, isValid  = validateRegisterInput(req.body);
  // Check validation
  if (!isValid) 
    return res.status(400).json(errors);
  

  User.findOne( email: req.body.email ).then(user => 
    if (user) 
      return res.status(400).json( email: "Email already exists" );
     else 
      const newUser = new User(
        name: req.body.name,
        email: req.body.email,
        password: req.body.password,
        location:req.body.location,


      );

      // Hash password before saving in database
      bcrypt.genSalt(10, (err, salt) => 
        bcrypt.hash(newUser.password, salt, (err, hash) => 
          if (err) throw err;
          newUser.password = hash;
          newUser
            .save()
            .then(user => res.json(user))
            .catch(err => console.log(err));
        );
      );
    
  );
);


错误:

(node:7064) UnhandledPromiseRejectionWarning: CastError: Cast to embedded failed for value "\'DGR\'" at path "farm" 在新的 CastError (C:\Users\Pritam Kumar\Documents\Mern auth\mern-auth-Sagita\node_modules\mongoose\lib\error\cast.js:29:11) 在 DocumentArray.cast (C:\Users\Pritam Kumar\Documents\Mern auth\mern-auth-Sagita\node_modules\mongoose\lib\schema\documentarray.js:402:19) 在 DocumentArray.cast (C:\Users\Pritam Kumar\Documents\Mern auth\mern-auth-Sagita\node_modules\mongoose\lib\schema\documentarray.js:336:17) 在 DocumentArray.SchemaType.applySetters (C:\Users\Pritam Kumar\Documents\Mern auth\mern-auth-Sagita\node_modules\mongoose\lib\schematype.js:892:12) 在 DocumentArray.SchemaType._castForQuery (C:\Users\Pritam Kumar\Documents\Mern auth\mern-auth-Sagita\node_modules\mongoose\lib\schematype.js:1304:15) 在 DocumentArray.SchemaType.castForQueryWrapper (C:\Users\Pritam Kumar\Documents\Mern auth\mern-auth-Sagita\node_modules\mongoose\lib\schematype.js:1271:17) 在 castUpdateVal (C:\Users\Pritam Kumar\Documents\Mern auth\mern-auth-Sagita\node_modules\mongoose\lib\helpers\query\castUpdate.js:434:19) 在 walkUpdatePath (C:\Users\Pritam Kumar\Documents\Mern auth\mern-auth-Sagita\node_modules\mongoose\lib\helpers\query\castUpdate.js:261:22) 在 castUpdate (C:\Users\Pritam Kumar\Documents\Mern auth\mern-auth-Sagita\node_modules\mongoose\lib\helpers\query\castUpdate.js:79:18) 在 model.Query._castUpdate (C:\Users\Pritam Kumar\Documents\Mern auth\mern-auth-Sagita\node_modules\mongoose\lib\query.js:4319:10) 在 castDoc (C:\Users\Pritam Kumar\Documents\Mern auth\mern-auth-Sagita\node_modules\mongoose\lib\query.js:4347:18) 在 model.Query.Query._findAndModify (C:\Users\Pritam Kumar\Documents\Mern auth\mern-auth-Sagita\node_modules\mongoose\lib\query.js:3325:19) 在模型.查询。 (C:\Users\Pritam Kumar\Documents\Mern auth\mern-auth-Sagita\node_modules\mongoose\lib\query.js:2902:8) 在 model.Query._wrappedThunk [as _findOneAndUpdate] (C:\Users\Pritam Kumar\Documents\Mern auth\mern-auth-Sagita\node_modules\mongoose\lib\helpers\query\wrapThunk.js:16:8) 在 process.nextTick (C:\Users\Pritam Kumar\Documents\Mern auth\mern-auth-Sagita\node_modules\kareem\index.js:369:33) 在 process._tickCallback (internal/process/next_tick.js:61:11) (节点:7064) UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或者 通过拒绝未使用 .catch() 处理的承诺。 (拒绝编号:1) (节点:7064)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。 (node:7064) DeprecationWarning: Mongoose: findOneAndUpdate()findOneAndDelete() 不推荐将 useFindAndModify 选项设置为 false。见:https://mongoosejs.com/docs/deprecations.html#-findandmodify-

O/P

id:5d034237a9a144428459a120
name:"Auditi"
email:"b@b.com"
password:"$2a$10$qHvr3VurbyvJyuqbV11NVeKLjn8jhTuP7piI5yMNBOLOQac98zcC2"
location:"XYZ"
createdDate:2019-06-14T06:44:07.035+00:00
farm:Array(data is saved)
__v:0

【问题讨论】:

【参考方案1】:
First of all, in the schema correct this:

     farm:[
          
            description:String,
            farmAddDate:type:Date,default:Date.now,
            device:[Device]
          
      ]  

不要在farm数组中使用_id,_id是自动生成的字段,添加新条目时会自行创建。 此外,您不能比较记录中的整个数组。

User.findOneAndUpdate( farm: req.body.farm ) 

这是错误的方法,它永远不会返回匹配的记录。

【讨论】:

如果我在农场中添加一个位置字符串字段,那么如何访问它来更新或获取它​​,这部分让我心烦意乱。我查看了嵌套文档,但这对我没有帮助 我应该更喜欢什么方法,登录用户可以添加农场。 @Jaspreet User.update('farm._id': 5b3343adaea0, '$set': 'farm.$.description': '更新描述', 'farm.$.farmAddDate': '更新日期' , function(err) ... 供参考,可以看:tech-blog.maddyzone.com/node.js/…

以上是关于如何将数据保存到 mongodb 中的子文档中?我正在将农场子文档转换为 null的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB - 无法将时间戳字段添加到数组中的子文档

如何使用 C# 将字符附加到 MongoDB 文档中的字符串

如何匹配 MongoDB 中的子文档数组?

如何替换mongodb文档中的子字符串

如何匹配MongoDB中的子文档数组?

如何使用 C# 驱动程序更新 MongoDB 数组中的子文档