هنوز چند بایت مونده که پیدا کنم...

ذخیره و بازیابی GUID در MongoDB با استفاده از C#

فرض کنید شما دارید آبجکت های سی شارپ رو توی مانگو دی بی به صورت داکیومنت (Document) ذخیره می کنید. خوب اگر آبجکت شما فیلدی به اسم id داشته باشه جناب مانگو میاد این فیلد رو به اسم id_ توی داکیومنت مورد نظر ذخیره میکنه و جالب اینجاست که اگر این فیلد از نوع GUID مایکروسافت باشه به صورت داده باینری ذخیره میشه (یعنی همون UUID استاندارد) که البته درست هم هست فرض کنید فردا روزی شما خواستید از زبان برنامه نویسی دیگه ای مثل جاوا استفاده کنید باید این id ها قابل شناسایی و استفاده باشن یا نه؟
 
خوب مشکل کجاست؟ مشکل اینجاست که اگر شما بخواید فیلتری بر اساس آی دی ایجاد کنید درایور سی شارپ چیزی بر نمی گردونه. چرا؟ چون میاد مقدار رشته ایِ guid را با مقادیر باینری ذخیره شده توی دیتابیس مقایسه میکنه. راه حل تبدیل موقع سرچ هست و در نظر داشتن این نکته که ما باید id را با اسم id_ مقایسه کنیم!
/* 
          using System;
          using System.Collections.Generic;
          using System.Linq;
          using System.Threading.Tasks;
          using FluentAssertions;
          using MongoDB.Bson;
*/

public async Task<BsonDocument> FindUserById(Guid id)
{
          _client = new MongoClient();
          _database = _client.GetDatabase("test");
          
          var collection = _database.GetCollection<BsonDocument>("users");

          // wrong :  Builders<BsonDocument>.Filter.Eq("id", BsonBinaryData.Create(id));
          // wrong :  Builders<BsonDocument>.Filter.Eq("_id", id);
          // wrong :  Builders<BsonDocument>.Filter.Eq("_id", id.ToString());
          // this is we all missing : BsonBinaryData.Create

          var filter = Builders<BsonDocument>.Filter.Eq("_id", BsonBinaryData.Create(id));
          return await collection.Find(filter).FindAsync();
}

نکته

Working with GUID in MongoDB via C# driver
نویسنده : محمد ملک مکان
شنبه 5 دی 1394
+ 130 -

خوشحال میشیم نظرتُ بدونیم