我有一个大型的日志和数据输入程序,它接收具有1个DataRow的DataTable对象。DataTable的列数是随机的,列名和类型也是随机的,所以我不能对每个列都有类。使用这些DataColumn,我得到了DataType,并从头开始构建了一个BsonDocument。
下面是一个简短的例子
public void ParseData(DataTable table)
{
// create the document
var document = new BsonDocument();
// get the only row in the table
var row = table.Rows[0];
// for each column we add the property
foreach (DataColumn column in table.Columns)
{
// create an empty value
BsonValue value = null;
// current column value
var columnValue = row[column.ColumnName];
// set the value based on the datatype
if (column.DataType == typeof(string)) value = new BsonString(columnValue.ToString());
else if (column.DataType == typeof(int)) value = new BsonInt32(Convert.ToInt32(columnValue));
else if (column.DataType == typeof(float)) value = new BsonDouble(Convert.ToDouble(columnValue));
else if (column.DataType == typeof(double)) value = new BsonDouble(Convert.ToDouble(columnValue));
else if (column.DataType == typeof(bool)) value = new BsonBoolean(Convert.ToBoolean(columnValue));
else if (column.DataType == typeof(DateTime)) value = new BsonDateTime(Convert.ToDateTime(columnValue));
// add the element
document.Add(new BsonElement(column.ColumnName, value));
}
// insert the document in the generic collection
InsertDocument(document);
}正如您所看到的,它非常简单。我删除了列表中的许多类型,因为我们有许多自定义类型可能会通过,所以我只保留了基本类型。问题是我不知道如何强制BsonDateTime在集合中另存为本地时间。在对遗留应用程序进行过滤时,它不起作用。我需要将它们保存为本地时间。这在过去从来不是一个问题,但由于90年代早期的那些遗留应用程序仍然需要支持,我必须弄清楚一些东西。
我还需要将它们重新加载为本地时间。如果可以,我会将它们保存为字符串,但我不能,因为因为所有列都是随机的,所以我不知道何时加载特定的BsonString是否真的是一个string,或者它是否是一个DateTime。对于重载,我不能真的作为本地时间重载。我必须重新加载数据库中的确切值。我只控制文档的创建。但我只控制了一小部分C#,Java和C++格式的。剩下的都是遗留的应用程序,这些公司甚至不存在了。
我确实试着修改了系统中的每个日期,以适应世界协调时间,并将日期更改为世界协调时它的存储属性和遗留应用程序的过滤器仍然有效,但所有的.NET,Java和C++应用程序加载了错误的值,而不是书面的值。
有没有一种方法可以像在SQL server中那样直接在MongoDB中禁用特定集合或数据库中的UTC?
发布于 2020-08-05 22:18:09
MongoDB以协调世界时存储时间,不支持时区。您可以存储任何您喜欢的值,但是大多数MongoDB相关软件会将它们解释为UTC时间戳。
https://stackoverflow.com/questions/63266662
复制相似问题