我试图使用MongoDB在ASP.NET Core中创建一个字典数组数组。最后,数据应保留此模型用于所有用途:
模型
{
"ContextName": "Base rates",
"Indexes": [
{
"IndexName": "S&P",
"IndexValues" : [
{
"Date": "2019-01-01",
"Value": "2600.98"
},
{
"Date": "2019-01-02",
"Value": "2605.98"
}
]
}
]
}
目前,我的第一层定义如下,包括ContextName
和Indexes
:
Context.cs
public class Context
{
[BsonId]
[BsonRepresentation(MongoDB.Bson.BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("ContextName")]
public string ContextName { get; set; }
[BsonElement("Indexes")]
public ICollection<Index> Indexes { get; set; }
}
Index
具有以下结构:
Index.cs
public class Index
{
[BsonElement("IndexName")]
public string IndexName { get; set; }
[BsonElement("IndexValues")]
[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)]
public Dictionary<DateTime, double> IndexValues { get; set; }
}
运行此代码我遇到格式异常说明
反序列化类Database.Index的IndexValues属性时发生错误:无效元素:'Date'。
我的第一个想法是,密钥是Date
类型的问题,而不是数据库本身的string
问题,但是我已经读过here towards the bottom,官方驱动程序实际上支持这个。
我进一步尝试设置一些自定义{ get; set; }
以将密钥作为字符串引入但最终遇到了相同的错误。
public Dictionary<DateTime, double> IndexValues
{
get
{
Dictionary<DateTime, double> _indexValues = new Dictionary<DateTime, double>();
foreach (var indexValue in IndexValues)
{
_indexValues.Add(indexValue.Key, indexValue.Value);
}
return _indexValues;
}
set { IndexValues = IndexValues; } // Unsure about here as well
}
我不确定该案件的目的是什么,我正在寻找一些指出来解决这个问题。提前致谢。
在外部方法中格式化字典允许正确的格式,但是在收集所有必需信息时也会插入一个额外的字段。
public Dictionary<DateTime, double> IndexValuesDictionary
{
get { return SetDictionary(); }
set { SetDictionary(); }
}
private Dictionary<DateTime, double> SetDictionary()
{
if (_indexValues == null)
{
_indexValues = new Dictionary<DateTime, double>();
foreach (var indexValue in IndexValues)
{
_indexValues.Add(indexValue.Date, indexValue.Value);
}
}
return _indexValues;
}
{
"id": "5c93c1123369220b685719b3",
"contextName": "Base rates",
"indexes": [
{
"indexName": "S&P",
"indexValues": [
{
"date": "2019-01-01T00:00:00Z",
"value": 2600.98
},
{
"date": "2019-01-02T00:00:00Z",
"value": 2605.98
}
],
"indexValuesDictionary": { // This should not be included
"2019-01-01T00:00:00Z": 2600.98,
"2019-01-02T00:00:00Z": 2605.98
}
}
]
}
这是此输出唯一可行的选项吗?
退后一步并查看数据结构后,我能够通过删除数组嵌套并仅使用文档嵌套(不幸但简化模式)来实现这一点。更新的数据库结构是:
[
{
"ContextName": "Base rates",
"Description": "Base rates description",
"Indexes": {
"SPX": {
"2019-01-01T00:00:00Z": 2600.98
},
"NDX": {
"2019-01-01T00:00:00Z": 6600.98
}
}
}
]
将类结构更新为:
Context.cs
public class Context
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
[BsonElement("ContextName")]
public string ContextName { get; set; }
[BsonElement("Description")]
public string Description { get; set; }
[BsonElement("Indexes")]
[BsonDictionaryOptions(DictionaryRepresentation.Document)]
public Index Indexes { get; set; }
}
Index.cs
public class Index : Dictionary<string, Dictionary<DateTime, double>> { }
我还改变了序列化器来将DateTime
视为string
,所以在程序启动时将其包括在内:
BsonSerializer.RegisterSerializer(new DateTimeSerializer(DateTimeKind.Local, BsonType.String));
这些更改允许正确格式化结构。