在mongoDB / mongoose中构建模式正确

时间:2017-08-15 14:40:22

标签: node.js mongodb mongoose

我试图投票投票应用。 我的大问题是我无法创建一个对象数组并访问它们。我尝试对这样的民意调查进行一些选择投票:

title:"question?"
option:content:"1 answer",vote:0
       content:"2 answer",vote:0 
       content:"3 answer",vote:...

并构建类似的模式:

var mongoose = require("mongoose");
var pollSchema = new mongoose.Schema({
   title: String,
   maker :{
      id:{
         type: mongoose.Schema.Types.ObjectId,
         ref: "User"
      },
      username: String
   },
   options:[{content: String,vote:{type:Number,default:0}}]
});
module.exports = mongoose.model("Poll",pollSchema);

从那里获取数据:

<div class="form-group" id="option">
  <label for="Option 1">Options</label>
  <input type="text" class="form-control" name="options[content]" placeholder="Option 1">
  <input type="text" class="form-control" name="options[content]" placeholder="Option 2">
</div>

并且mongoDB中的输出是:

{
 "_id": {
     "$oid": "5993030dc5fa8c1b4f7eb176"
 },
 "title": "Some question?",
 "options": [
     {
         "content": "opt 1,opt 2",
         "_id": {
             "$oid": "5993030dc5fa8c1b4f7eb177"
         },
         "vote": 0
     }
 ],
 "maker": {
     "username": "Naor Malca"
 },
 "__v": 0
}

我希望每个选项都有单独的contentidvote。 也许我输入数据符号?或者模式是worng?

更新: 这是我的路线代码:

    //NEW POLL ROUTE
app.post("/",function(req, res){
    var title   = req.body.title;
    var options = req.body.options;
    var maker   = req.body.maker;
    var newPoll = {title:title,options:options,maker:maker};
    Poll.create(newPoll,function(err,poll){
        if(err){
            res.send("create error");
        } else{
            res.redirect("/");
        }
    });
});

仍然没有使用输出:(它使文本成为一个数组而不是一个对象数组......)

{ _id: 5993fcad9a63350df274b3e5,
  title: '111',
  __v: 0,
  options: [ { text: '222,333', _id: 5993fcad9a63350df274b3e6, vote: '0' } ],
  maker: { username: 'naor' } }

1 个答案:

答案 0 :(得分:1)

构建表单时,添加[number]以使每个选项都不同。

<div class="form-group" id="option">
    <label for="Option 1">Options</label>
    <input type="text" class="form-control" name="options[0][content]" placeholder="Option 1" value="value1">
    <input type="text" class="form-control" name="options[1][content]" placeholder="Option 2" value="value2">
</div>

当你提交表单时,它应该作为对象数组返回

req.body.options = [
    { content: 'value1' },
    { content: 'value2' }
]

这是构建包含分组元素的“添加”表单时的典型方法。

-

当涉及“编辑”表单以便您想要更新现有选项时,您可以传递选项_id

以下是使用EJS

的示例
<div class="form-group" id="option">
    <label for="Option 1">Options</label>
    <% poll.options.forEach(option => { %>
        <input type="text" class="form-control" name="options[<%= option._id %>][content]" placeholder="Option 1" value="<%= option.content %>">
    <% }) %>
</div>

此处req.body.options应为对象

req.body.options = {
    'some-id': { 
        content: 'value1' 
    },
    'another-id': { 
        content: 'value2' 
    }
}

保存时,您将使用键_id迭代对象。我想你可以利用id()找到要设置的对象。

-

如果它没有以上述格式返回,您很可能需要使用并设置bodyParser