【问题标题】:Custom "types" in JSON (node/express) and JSON arraysJSON(节点/快递)和 JSON 数组中的自定义“类型”
【发布时间】:2016-12-18 22:09:32
【问题描述】:

我最近不得不将一个使用 ASP.NET Core 1.0 完成大量工作的项目转换为 Node.js。我完全脱离了我的舒适区,对 JavaScript 几乎一无所知,并且我在 ASP 序列化 C# 类的过程中过着美好的生活,而无需我自己做 JSON。 Node 想让我自己做 JSON,但我玩得很不愉快。

这是一款健身应用。您的客户取得了一些进展,包括他们的电梯和其他东西。在 C# 中,它位于 Workouts 对象中,如下所示:

    public struct Progress
    {
        public Workout[] Workouts;
    }

Workouts 是一个可重复使用的对象,其中包含时间、组、重复等所有好东西。我可以在每一个需要它的模式中重新编写 Workouts 对象,但一定有更好的方法吗?我读过一些关于 $schema$ref 的文章,但不熟悉如何使用它们,或者这是否是这些关键字的正确应用。

最后,如何定义这个自定义 Workout 对象的数组?

到目前为止,这是我的 JSON 对象和 client.js 的内容。进度位是我最希望实现的目标。

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var ClientSchema = new Schema({
    measurements: [{
        height: Number,
        weight: Number
    }],
    personal_information: [{
        birthday: Date,
        gender: String
    }],
    contact_information: [{
        phone: String,
        email: String
    }],
    progress: [{
        workouts: WorkoutList
    }]
});

【问题讨论】:

  • 您是在问一个架构是否可以将另一个架构用于嵌入文档?
  • @JasonCust 也许?我在其他几个不同的模式中使用 Workouts 模式,所以我想避免在不同的模式中一次又一次地编写它,而只是调用“进度:锻炼”之类的东西。有什么想法吗?
  • 这取决于您是否希望相同的数据包含在不同的模式中,或者您是否只想要相同的结构。例如,给定从ClientSchema 创建的包含client.progress[].workouts 子文档的文档,该子文档表示的数据是否只需要可以从该特定客户端文档访问,或者它也需要是子文档在另一个文件(客户或其他)中?
  • @JasonCust 我真的很想复制结构。每个客户的进度数据会有所不同。

标签: javascript c# json node.js schema


【解决方案1】:

如果您只想要一个可用于各种其他模型的通用数据结构,那么您可以创建一个 sub-doc schema(可能有也可能永远不会有自己的模型),供各种其他架构使用。

注意:这提供了一个单例模式对象,这意味着如果您要修改一个模型,它将传播到以后使用它的任何其他模型。如果这是一个问题,那么您可以将workout-list-schema.js 转换为每次都会返回一个新模式对象的工厂函数。

workout-list-schema.js

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var WorkoutListSchema = module.exports.WorkoutListSchema = new Schema({
  // some schema
});

client-schema.js

var mongoose = require('mongoose');
var WorkoutListSchema = require('./workout-list-schema').WorkoutListSchema;
var Schema = mongoose.Schema;

var ClientSchema = new Schema({
  measurements: [{
    height: Number,
    weight: Number
  }],
  personal_information: [{
    birthday: Date,
    gender: String
  }],
  contact_information: [{
    phone: String,
    email: String
  }],
  progress: [{
    workouts: WorkoutListSchema
  }]
});

【讨论】:

  • 这太好了,谢谢!你知道如何使锻炼列表模式成为一个实际的列表(如锻炼数组)吗?
  • @KingDan 我不确定您的意思,但如果您指的是workouts 是一个列表,那么您可以将架构编辑为:workouts: [WorkoutListSchema]
  • 这绝对是我想要的。你是一颗彻头彻尾的宝石。谢谢你:)
猜你喜欢
  • 2015-12-17
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
相关资源
最近更新 更多