如何将数据保存到 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的主要内容,如果未能解决你的问题,请参考以下文章