【问题标题】:Mongodb not casting data correctlyMongodb没有正确转换数据
【发布时间】:2018-06-07 11:18:33
【问题描述】:

当我在数据库上发布数据时,有些数据没有存储在我的数据库中。

这是我的模型的架构:

var ProjSchema = new Schema({
  leadProj: String,
  nomProj: String,
  descProj: String,
  BesProj: Number,
  pers: [
    {
      name: String,
      poste: String
    }
  ],
  backlog: { fonctionnalite: [String], userStory: [String] }
});

我使用 Express for Api,这是路线

  .post(function(req, res) {
    var nouvProj = new NouvProj();
    nouvProj.nomProj = req.body.nomProj;
    nouvProj.leadProj = req.body.leadProj;
    nouvProj.descProj = req.body.descProj;
    nouvProj.BesProj = req.body.BesProj;
    nouvProj.pers = req.body.pers;
    nouvProj.backlog.fonctionnalite = req.body.Fonctionnalite;
    nouvProj.backlog.userStory = req.body.UserStory;
    console.log(req.body.Fonctionnalite);
    console.log(req.body.UserStory);

    // save the nouvProj and check for errors
    nouvProj.save(function(err) {
      if (err) {
        res.send(err);
        console.log("err");
      }
      res.json({
        message: "nouvProj created!"
      });
    });
  })

console.log()的输出

[ { fonctionnalite: 'oijoij' }, { fonctionnalite: 'oio' } ]
[ { userStory: 'oijoij' }, { userStory: 'poihpohi' } ]

问题出在backlog item 上。当我得到元素时,我得到的是空数据:

backlog : []

更新:我会准确区分persbacklog Pers item 是 {name: String, poste} 的表 backlog 是 {fonctionnalite: String} 和 {UserStory : String} 的表

我不明白为什么这适用于 pers 而不适用于 backlog

【问题讨论】:

  • 你能查一下console.log(nouvProj.backlog.fonctionnalite)console.log(nouvProj.backlog.userStory)
  • Fonctionnalite 应该是一个字符串数组,但您提供的是一个对象数组。与userStory 相同。
  • @MikaS 我不这么认为,因为它是一个自定义对象,我想知道他是想将这个“积压”定义为一个数组还是他需要它作为一个对象

标签: node.js mongodb express mongoose mongoose-schema


【解决方案1】:

我认为您只将一个字符串传递给您的functionalite,而您将其定义为array,您应该将该值推送到您的数组中,而不是为其分配一个字符串。

nouvProj.backlog.fonctionnalite.push(req.body.Fonctionnalite);
nouvProj.backlog.userStory.push(req.body.UserStory);

如果要定义灵活或松散的对象(无模式),其属性或模式字段在运行时指定,可以使用Schema.Types.Mixed

//schema defintion
var proj = new Proj({
  myObject: Schema.Types.Mixed
});

//how use it 
var proj = new Proj();
proj.myObject = { any: { fields: ['test'] } }
yourSchema.save()

如果您想将您的backlog 定义为一个数组,我建议您这样做。

var BackLog = new Schema({ 
 fonctionnalite: [String], 
 userStory: [String] 
};

var ProjSchema = new Schema({
  leadProj: String,
  nomProj: String,
  descProj: String,
  BesProj: Number,
  pers: [
    {
      name: String,
      poste: String
    }
  ],
  backlog: [BackLog]
});

// create a project 
var proj = new ProjSchema({
  ....
});
//you notice functionalite is an array, userStory is also an array 
proj.backlog.push({ functionalite: ['test'], userStory: ['sss'] });

proj.save(function (err) {
  ...
}

有关 Mongoose 架构和建模的更多信息,请访问 hereHeroku's Dev. blog

【讨论】:

    【解决方案2】:

    似乎req.body.Fonctionnalitereq.body.UserStory 都是对象数组,并且在您的 shcema 中它们被声明为字符串数组,您需要重新定义 ProjSchema 以接管此行为:

    var ProjSchema = new Schema({
        leadProj: String,
        nomProj: String,
        descProj: String,
        BesProj: Number,
        pers: [
        {
            name: String,
            poste: String
        }
        ],
        backlog: { 
            fonctionnalite: [ { fonctionnalite: String } ], 
            userStory: [ { userStory: String } ], 
        }
    });
    

    或者您可以保持ProjSchema 原样,并以fonctionnaliteuserStory 作为普通数组发布的方式更新前端代码:

    fonctionnalite => [ 'oijoij', 'oio' ]
    userStory => [ 'oijoij','poihpohi' ]
    

    【讨论】:

      猜你喜欢
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 2016-05-20
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多