【发布时间】:2018-01-13 16:07:14
【问题描述】:
我在 WebApi 应用程序中使用带有 C# 的 MongoDb。由于所存储文档的动态特性,我的数据不能很好地适用于映射数据类型。例如,这里是一些数据的示例。请注意 Data 部分的值可以是数组或单个字符串 (Technician):
{
"_id" : "5a59129d16d5c42f7444b83d",
"CreatedDate" : "2018-01-09T20:30:19.455Z",
"Data" : {
"AlcoholTest" : [
{
"Technician" : [
"STT",
"BAT"
],
"TestReason" : "not well"
}
]
}
}
当我尝试像上面那样返回数据时,我得到了这个:
{
"_id": {
"$oid": "5a59129d16d5c42f7444b83d"
},
"CreatedDate": {
"$date": 1515529819455
},
"Data": {
"AlcoholTest": [
{
"Technician": [
"STT",
"BAT"
],
"TestReason": "drunk"
}
]
}
}
这是我正在使用的代码:
public object FindById(string id)
{
var filter = new BsonDocument { { "_id", ObjectId.Parse(id) } };
var result = _collection2.Find(filter);
var note = result.Any() ? result.First() : null;
var json = note.ToJson(new JsonWriterSettings{OutputMode = JsonOutputMode.Strict});
return JObject.Parse(json);
}
我不能只返回 note 对象,因为 Newtonsoft 不知道如何将这些 $data 和 $oid 转换为有效类型并返回解析错误。
当我尝试在 .NET 中使用 MongoDb 映射类时,这就是我的类的样子(为简单起见,我不包括 BsonClassMap.RegisterClassMap 的东西):
public class Note
{
public string Id { get; set; }
public DateTime? CreatedDate { get; set; }
public IDictionary<string, IList<IDictionary<string, object>>> Data { get; set; }
}
当我尝试这段代码时,Newtonsoft 不知道如何处理IList<IDictionary<string, object>> 中的object 可能是数组或字符串的情况,而是保存了一些相当讨厌的JArray 和JObject 数据。
所以这是我的问题:
- 有没有办法让上述 C# 代码返回与 Mongo 数据库中表示的 JSON 相同的 JSON(或 UI 发送并期望返回的 JSON)?
- 或者有没有一种方法可以使用 .NET 类型映射我的
Data文档,从而允许我使用接受字符串值、数组或两者的 MongoDb 映射类?
【问题讨论】:
-
记住一个MongoDB文档,对象Id already has the creation date...不需要再添加那个字段