在MongoDB中存储变量结构的对象

时间:2018-01-05 08:45:05

标签: javascript node.js mongodb mongoose

我正在使用mongodb和node.js移动我的第一步,我对猫鼬和存储接收的数据有一些疑问。

我正在尝试使用端点创建一个REST API,用于以json格式提交(POST)“stuff”。 我会将这些“东西”存储在mongodb中,但我没有精确的架构:提交的数据都是相似且相关的,但有些可能因某些字段而有所不同。

例如,我可以收到:

object_1

{
  field1: value1
  field2: value2
}

object_2

{
  field1: value1
  field3: value3
}

它们在某种程度上是相似的,它们都代表相同的对象类型,它们只缺少一些字段(如null或其他)。

阅读一些文档和教程,我看到mongoose需要一个“模式”,比如

var mySchema = mongoose.Schema({
   foo: String
   bar: String
});

如果我没有固定架构怎么办?我可以在不使用模式的情况下将'object_1'和'object_2'存储在同一个集合中(因为它们是相关的)吗?

谢谢!

编辑:

要明确,提交的json来自一项调查,例如:

{
  // standard/default fields
  id: 2,
  date: 'timestamp',
  surveyId: 13,
  ...
  // here starts non-standard fields list
}

每个调查都有许多字段,但不是每个字段都是强制性的,有时字段可以留空(或为空),并且它根本不包含在json体中。在一个提交中,我可能有{field1,field2,field3},在下一个{field1,field3,field4,field5}等等......

其中一些是标准的,如id,datetime和其他一些。我可以在我的架构中声明它们,但其他的呢?

我希望它很清楚!

谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用所有可能的键创建架构,但不要求所有键都被填充。这样,您可以为两个对象重用模式,其中一些键将具有值,而其他键将是未定义的。

var survey = mongoose.Schema({
  id: Number,
  date: String,
  surveyId: Number,
  customfield1: String,
  customfield2: String
});

当您发布object_1时,您会得到类似

的内容
{
  id: 1,
  date: 'timestamp',
  surveyId: 1,
  customfield1: 'value'
}

而对于object_2,你会得到

{
  id: 2,
  date: 'timestamp',
  surveyId: 2,
  customfield*2*: 'value'
}