我正在尝试创建一个Mongo文档,然后从一个表单中更新文档以具有其他属性,其中一个具有一个对象数组。
m能够将除物体之外的所有东西保存到地址数组。
以下代码片段显示了我当前尝试将对象保存到地址数组。我觉得我错过了我尝试的推送或移位,似乎无法得到正确的语法。
Mongoose Schema:
var UserSchema = new mongoose.Schema({ username:{type:String,lowercase:true} ,密码:{type:String} ,电子邮件:{type:String,lowercase:true} ,phone:{type:String} ,newsletter:Boolean ,created:{type:Date,default:Date.now} ,address:[{ nickname:{type:String} ,streetAddress:{type:String} ,streetAddress2:{type:String} ,state:{type:String} ,zip:{type:String} }] });模型方法: 首先我创建一个帐户。该表单只要求用户名,电子邮件,密码,然后重定向到玉器文件,用户可以填写其余的表单。
module.exports = exports = function(){ //创建帐户 this.createAndSave = function(req,res){ new User({ username:req。 body.username ,密码:req.body.password ,电子邮件:req.body.email ,电话:req.body.phone ,地址:[{昵称:req.body.nickname ,streetAddress:req.body.streetAddress ,streetAddress2:req.body.streetAddress2 ,state:req.body.state , zip:req.body.zip }] })。save(function(err,user){ if(err)throw err; req.session.isLoggedIn = true; req.session.user = user.username; res.redirect('/ account /' + user.username)})} //更新帐户 this.updateRequest = function(req,res){ User.update ({username:req.user.username},{ username:req.body.username ,email:req.body.email ,phone:req.body.phone ,通讯:req.body.newsletter ,地址:[{昵称:req.body.nickname ,streetAddress:req.body.streetAddress ,streetAddress2:req。 body.streetAddress2 ,state:req.body.state ,zip:req.body.zip }] },function(err){ res。 redirect(/ account /+ req.body.username); }); }玉模板:(我确信这可以更干净)
h1编辑用户#{user} form(method =POST ,action =/ account /#{user.username}) input(type =hidden,name =_ method,value =PUT) .form-group label(for =username)名称输入#name.form-control(type =text,name =username,value = user.username) .form -group label(for =email)电子邮件 input#email.form-control(type =email,name =email,value = user.email) .form-group label手机输入#phone.form-control(type =text,name =phone,value = user.phone) .form-group label通讯选项输入/输出 input#newsletter(type =checkbox,name =newsletter,checked =(true === false?checked:undefined) ) if(user.address.length> 0) for(var i = 0; i< user.shippi ngAddresses.length;我的名字=streetAddress,value = user。 shippingAddresses [i] .streetAddress) .form-group 标签地址续输入#address2.form-control(type =text,name =streetAddress2 value = user.shippingAddresses [i] .streetAddress2) .form-group 标签邮政编码输入#zip.form-control(type =text,name = zip,value = user.shippingAddresses [i] .zip) else .form-group 标签位置昵称 input#address.form-control(type = text,name =nickname,value =) .form-group label街道地址 input#address.form-control(type =text NAME =streetAddr ess,value =) .form-group label Address Cont。 输入#address2.form-control(type =text,name =streetAddress2,value =) .form-group 标签状态输入#state.form -control(type =text,name =state,value =) .form-group label邮政编码输入#zip.form-control(type =text ,name =zip,value =) 按钮(type =submit)更新帐户另外还有另一个地址,这就是为什么地址是一个数组。
任何方向都是非常有帮助的,因为我可能会随时随地。如果你进一步的代码让我知道。另外要注意的是,我无法从更新功能中获取任何更新的数据,以保存到mongo。
谢谢!
解决方案这是我想出的解决方案。我找到文档来更新并将对象推送到存储数组的属性。
示例方法:
this.addAddress = function(req,res){ var newAddress = { nickname:req.body.nickname, streetAddress:req.body .streetAddress, streetAddress2:req.body.streetAddress2, state:req.body.state, zip:req.body.zip } User.update ({username:req.session.user},{$ push:{ address:newAddress }},{upsert:true},function(err){ if(err){ console.log(err); } else { console.log(Successfully added); } })}
I'm attempting to create a Mongo document then update the document form a form to have additional properties, one of which has an array of objects.
I'm able to save everything except objects to the address array.
The following code snippets show my current attempt to save an object to the address array. I feel like I'm missing a push or shift which I've tried and can't seem to get syntax correct.
Mongoose Schema:
var UserSchema = new mongoose.Schema({ username: { type: String, lowercase: true } , password: { type: String } , email: { type: String, lowercase: true } , phone: { type: String } , newsletter: Boolean , created: { type: Date, default: Date.now } , address: [{ nickname: { type: String } , streetAddress: { type: String } , streetAddress2: { type: String } , state: { type: String } , zip: { type: String } }] });Model Methods: First I create an account. The form only asks for username, email, password then redirects to the jade file where users can fill out the rest of the form.
module.exports = exports = function(){ //create account this.createAndSave = function (req, res ) { new User({ username: req.body.username , password: req.body.password , email: req.body.email , phone: req.body.phone , address: [{ nickname: req.body.nickname , streetAddress: req.body.streetAddress , streetAddress2: req.body.streetAddress2 , state: req.body.state , zip: req.body.zip }] }).save(function (err, user){ if (err) throw err; req.session.isLoggedIn = true; req.session.user = user.username; res.redirect('/account/' + user.username) }) } //update account this.updateRequest = function (req, res) { User.update({username: req.user.username}, { username: req.body.username , email: req.body.email , phone: req.body.phone , newsletter: req.body.newsletter , address: [{ nickname: req.body.nickname , streetAddress: req.body.streetAddress , streetAddress2: req.body.streetAddress2 , state: req.body.state , zip: req.body.zip }] }, function (err) { res.redirect("/account/" + req.body.username); }); }Jade Template: (I'm sure this could be cleaner)
h1 Edit User #{user} form(method="POST", action="/account/#{user.username}") input(type="hidden", name="_method", value="PUT") .form-group label(for="username") Name input#name.form-control(type="text", name="username", value= user.username ) .form-group label(for="email") Email input#email.form-control(type="email", name="email", value= user.email ) .form-group label Phone input#phone.form-control(type="text", name="phone", value= user.phone ) .form-group label Newsletter Opt In/Out input#newsletter(type="checkbox", name="newsletter", checked=(true===false ? "checked" : undefined)) if(user.address.length > 0) for (var i = 0; i < user.shippingAddresses.length; i++) {}>) .form-group label Street Address input#address.form-control(type="text", name="streetAddress", value= user.shippingAddresses[i].streetAddress ) .form-group label Address Continued input#address2.form-control(type="text", name="streetAddress2", value= user.shippingAddresses[i].streetAddress2 ) .form-group label Zip Code input#zip.form-control(type="text", name="zip", value= user.shippingAddresses[i].zip ) else .form-group label Location Nick Name input#address.form-control(type="text", name="nickname", value= ) .form-group label Street Address input#address.form-control(type="text", name="streetAddress", value= ) .form-group label Address Cont. input#address2.form-control(type="text", name="streetAddress2", value= ) .form-group label State input#state.form-control(type="text", name="state", value= ) .form-group label Zip Code input#zip.form-control(type="text", name="zip", value= ) button(type="submit") Update AccountAdditionally there is another address only form which is why the address is an array.
Any direction would be very helpful as I may go unhinged at any moment. If you any further code let me know.
Something else to note, I'm not able to get any of the updated data from the update function to save to mongo.
Thanks!
解决方案Here is the solution I came up with. I find the document to update and push an object to the property that stores the array.
Example method:
this.addAddress = function (req, res) { var newAddress = { nickname: req.body.nickname, streetAddress: req.body.streetAddress, streetAddress2: req.body.streetAddress2, state: req.body.state, zip: req.body.zip } User.update({username: req.session.user}, { $push : { address: newAddress }}, {upsert: true}, function ( err ) { if(err){ console.log(err); }else{ console.log("Successfully added"); } }) }
更多推荐
使用Express和Mongoose将表单数据发布到现有MongoDB文档的数组
发布评论