【问题标题】:Processing JSON creates a normal array instead of JSON object处理 JSON 会创建一个普通数组而不是 JSON 对象
【发布时间】:2014-10-29 21:39:36
【问题描述】:

来自外部 Web API 的 JSON 如下所示:

[{matches:
    [{
      "match_something":"123",
      "match_something_else":"Potato",
      "match_events":
      [{
          "event_id":"42",
          "event_desc":"redcard",
       },
       {
           "event_id":"1",
           ..
      }]
    },
    // more matches

因此,为每个匹配项匹配数组,其中包含一个事件数组。

相关处理代码如下:

        _.each(matches, function(match) {
            var results = new Results({
                _id: match.match_id,
                match_date: match.match_formatted_date,
                ft_score: match.match_ft_score,
                match_events:[]
            });
            events = match.match_events;
            _.each(events, function(event) {
               results.match_events.push({
                   _id:event.event_id,
                   match_id:event.event_match_id,
                   type:event.event_type,
                   team:event.event_team,
                   player:event.event_player,
               });
            });
            results_array.push(results);
        });
        return results_array

这是模型的架构(为简洁而缩短):

var resultsSchema = new db.mongoose.Schema({
        _id:Number,
        match_date:String,
        status:String,
        ...
        match_events:[{
            _id: Number,
            match_id: Number,
            type:String,
            ...
        }]
    });

然后,一旦完成,我从我的数据库 (mongo) 中看到的是以下 JSON(为清楚起见删除了额外的属性):

[
{"_id":1931559, "ft_score":"[0-0]","__v":0,
    "match_events":   
        ["19315591","19315592","19315593","19315594"]},

这让我很困惑。 ID 是正确的,我检查了服务器数据。处理代码只是为这些 ID 创建一个数组,而不是为每个事件创建一个 JSON 对象。

不应该显示为:

..."match_events":
    [{"_id:" "19315591", ...}]

【问题讨论】:

  • 我对这个数据库不熟悉,但是_id不是保留的吗?我的意思是你确定你可以在嵌套结构中定义一个带有 _id 的对象吗?似乎它将其解释为内部链接或类似的东西。我会在没有 _id 的情况下尝试一下...代码似乎还可以,所以这是一个奇怪的错误...
  • 是的,问题出在下面的另一个答案中指出的架构声明。我确实删除了 _id 以防万一将来会引起问题。谢谢
  • @inf3rno Mongoose 将使用您在架构中为_id 明确声明的任何“类型”,或者在您未定义的地方隐式添加ObjectId。它甚至会尝试将作为字符串提供的参数“转换”为正确的类型。
  • 我不确定这是好是坏。我的意思是如果没有错误消息就很难调试...至少它应该发送console.warn()...

标签: javascript json node.js mongodb mongoose


【解决方案1】:

您的架构定义是这里的问题。 Mongoose 使用 "type" 关键字来确定数据类型,因此它认为 "match_events" 是 "String" 的数组。

改为这样声明:

var resultSchema = new Schema({
  _id: Number,
  status: String,
  match_events: [{
    _id: { type: Number },
    type: { type: String }
  }]
});

或者像这样更好:

var eventSchema = new Schema({
  _id: Number,
  type: String
});

var resultSchema = new Schema({
  _id: Number,
  status: String,
  match_events: [eventSchema]
});

【讨论】:

  • 立即像魅力一样工作。感谢您为第二次实施付出的额外努力。也再次感谢尼尔的帮助,不胜感激。
  • 很好,至少保留字部分是真的:-)
  • 其实啊!当我从架构中删除 _id 时,刚看了看,mongo 为每个内部结构分配了一个 _id。所以看起来它是必需的:)
  • 至少我们也知道 :-)
猜你喜欢
  • 2021-09-22
  • 2011-06-13
  • 2017-04-01
  • 2021-12-24
  • 2013-06-04
  • 2020-08-03
  • 2018-03-06
  • 2017-01-04
  • 2018-07-03
相关资源
最近更新 更多