هندل کردن دو schema مختلف اطلاعات ذخیره شده MongoDB در ASP .NET Core
سلام و وقت بخیر به همه اعضا
داخل کالکشنی در مونگو اطلاعاتی دارم که با schema مختلفی به صورت زیر ذخیره شده اند:
{
...
phones:
{
0: {number:"123"},
1: {number:"456"}
}
...
}
و ساختار دوم:
{
...
phones:
[
{number:"123"},
{number:"456"}
]
...
}
یکی لیستی از آبجکت ها را در phones ذخیره شده و یکی آبجکت ها را به صورت آرایه داخل phones ذخیره کرده است.
بعد از کمی جست و جو به راه حلی رسیدم که بتونم schema های مختلف را با override کردن متد Deserialize هدنل کنم و به مدل anotation زیر را اضافه کردم:
public class Order
{
...
[BsonSerializer(typeof( FixingPhonesObjectSerialaizer ))]
public List<Phone> phones { get; set; }
...
}
و داخل کلاس FixingPhonesObjectSerialaizer متد های لازم را به شکل زیر override کردم:
public override List<Phone?> Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
if (context.Reader.CurrentBsonType == BsonType.Document)
{
List<Phone?> phones = new List<Phone?>();
var bsonReader = context.Reader;
bsonReader.ReadStartDocument();
IDiscriminatorConvention valueDiscriminatorConvention = BsonSerializer.LookupDiscriminatorConvention(typeo f(object));
while (bsonReader.ReadBsonType() != BsonType.EndOfDocument)
{
string key = bsonReader.ReadName();
Type valueType = valueDiscriminatorConvention.GetActualType(bsonRea der, typeof(object));
IBsonSerializer valueSerializer = BsonSerializer.LookupSerializer(valueType);
object value = valueSerializer.Deserialize(context);
phones.Add(BsonSerializer.Deserialize<Phone>(value .ToBsonDocument()));
}
bsonReader.ReadEndDocument();
return phones;
}
return base.Deserialize(context, args);
}
protected override void AddItem(object accumulator, object item)
{
((List<Phone?>)accumulator).Add(BsonSerializer.Des erialize<Phone>(item.ToBsonDocument()));
}
protected override object CreateAccumulator()
{
return new List<Phone?>();
}
protected override IEnumerable EnumerateItemsInSerializationOrder(List<Phone?> value)
{
return value;
}
protected override List<Phone> FinalizeResult(object accumulator)
{
return (List<Phone?>)accumulator;
}
}
فراخوانی داده ها بدون مشکل انجام میشه اما موقع ذخیره سازی داده ها عملیات serialize با مشکل مواجه میشه و خطای زیر را دریافت میکنم:
An error occurred while serializing the phones property of class App.Models.Order: Type App.Models.Phone is not configured as a type that is allowed to be serialized for this instance of ObjectSerializer.
برای رفع مشکل به ذهنم رسید که تابع serialize را هم override کنم اما نمیدونم داخل تابع چی باید بنویسم که مشکل حل بشه:
public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, List<Phone> value)
{
base.Serialize(context, args, value);
}
آیا شما راهکاری بهتری برای کنترل schema های مختلف داده هایی که از پایگاه داده مونگو خوانده میشه دارید یا روش درست serialize کردن داده ها را میدونید؟
پیشاپیش از دوستانی که راهنمایی میکنند تشکر میکنم.
نقل قول: هندل کردن دو schema مختلف اطلاعات ذخیره شده MongoDB در ASP .NET Core
در مورد مشکلی که با ساختارهای مختلف داده MongoDB دارید، میتوانید از نمایهگذاری یا سریالایزرهای سفارشی در MongoDB استفاده کنید تا ساختارهای مختلف داده را به صورت صحیح به مدلهای خود منطبق کنید. به نظر میرسد شما در حال استفاده از سریالایزر سفارشی هستید که کاربردی است.
در مورد خطایی که در زمان سریالایز کردن دادهها دریافت میکنید، این مشکل ممکن است به خاطر عدم تنظیم صحیح سریالایزر برای مدل Phone باشد. برای حل این مشکل، مطمئن شوید که Phone به درستی تنظیم و توسط BsonSerializer سریالایز شده باشد.
از کدی که شما ارائه دادهاید، به نظر میرسد که برای ساختارهای مختلف داده phones از یک سریالایزر سفارشی به نام FixingPhonesObjectSerialaizer استفاده میکنید. این سریالایزر سفارشی باید به صورت مناسب تنظیم شود تا با ساختارهای مختلف داده phones کار کند.
برای مشکل خطایی که دریافت میکنید، این خطا به احتمال زیاد به خاطر عدم تنظیم صحیح سریالایزر برای مدل Phone است. برای حل این مشکل، میتوانید کد سریالایزر سفارشی خود را مرور کنید و اطمینان حاصل کنید که تنظیمات و نوعهای مدلهای داده صحیح تنظیم شده باشند.
در نهایت، برای ساختارهای مختلف داده phones، باید مطمئن شوید که سریالایزر سفارشی شما بتواند از مناسب ترین تنظیمات و معیارها برای تبدیل دادهها به مدلهای مشخص استفاده کند. اگر باز هم مشکل دارید، اطلاعات بیشتری از ساختارهای داده موجود و کد سریالایزر خودتان را ارائه دهید تا بتوانم بهتر کمک کنم.