Запросите тип (класс C#) из коллекции BsonDocument в MongoDb
Я использую одну коллекцию для хранения экземпляров моих классов C# в виде BsonDocument в MongoDB через Azure CosmoDB. Мне удалось выполнить вставки, но я не мог ни обновлять, ни находить (фильтровать) запросы по моим классам C#. Вот несколько кодов:
//class 1
public class Subscriber
{
[MongoDB.Bson.Serialization.Attributes.BsonId]
[MongoDB.Bson.Serialization.Attributes.BsonRepresentation(MongoDB.Bson.BsonType.ObjectId)]
public string Id { get; set; }
public string Email { get; set; } = string.Empty;
}
//class 2
public class TokenDb
{
[MongoDB.Bson.Serialization.Attributes.BsonId]
[MongoDB.Bson.Serialization.Attributes.BsonRepresentation(MongoDB.Bson.BsonType.ObjectId)]
public string Id { get; set; }
public string Body { get; set; } = string.Empty;
public string OwnerGuid { get; set; } = string.Empty;
[MongoDB.Bson.Serialization.Attributes.BsonDateTimeOptions(Kind = DateTimeKind.Utc)]
public DateTime DateCreated { get; set; }
}
//context. Database has been connected/set from the Constructor.
public MongoCollection<BsonDocument> General
{
get
{
return Database.GetCollection<BsonDocument>("general");
}
}
//insert operation 1
internal static string SendSubscribeRequest(string email)
{
//check if email exists
long cursor = Context.General.Count(Query<Subscriber>.EQ(sub => sub.Email, email));
if (cursor > 0)
return "Email exists";
//insert a new Subscriber if email do not exist
Subscriber subscriber = new Subscriber { Email = email, Id = GetGuid.Normal() };
Context.General.Insert(subscriber);
return "Email Saved";
}
//insert operation 2
internal static string ResendVerificationEmail(string ownerGUID)
{
var token = new TokenDb() { Body = GetToken.New(), OwnerGuid = ownerGUID, DateCreated = DateTime.UtcNow };
Context.General.Insert(token);
return Constants.Messages.VerifyMessages.OTPSent;
}
Я предположил, что следующий код работает нормально, но я обнаружил, что работает только вставка. Оба типа данных были вставлены в документ, но теперь мне нужно запросить как класс aC# из этой коллекции. Вот мой код:
internal static string VerifyToken(string decStringToken, string decStringGuid)
{
var query = Query.And(
Query<TokenDb>.EQ(u => u.Body, decStringToken),
Query<TokenDb>.EQ(u => u.OwnerGuid, decStringGuid),
Query<TokenDb>.GTE(p => p.DateCreated, DateTime.UtcNow.AddMinutes(10)),
Query<TokenDb>.LTE(p => p.DateCreated, DateTime.UtcNow)
);
long count = Context.General.Count(query);
if (count > 0)
return Constants.Messages.VerifyMessages.Versucc;
return Constants.ErrorCodes.VerificationErrors.TokenExpired;
}
Как правило, запрос не фильтруется по классу am Querying from. Он просто возвращает все BsonDocuments. Вот другие примеры.
internal static void VerifySubscriber(string email)
{
//using FindOneAs
var query = Query<Subscriber>.EQ(u => u.Email, email);
Subscriber subscriber = Context.General.FindOneAs<Subscriber>(query);
//updating
var set = Update<Subscriber>.Set(p => p.Email, email);
Context.General.Update(query, set);
//FindAllAs
MongoCursor<Subscriber> cursor = Context.General
.FindAllAs<Subscriber>()
.SetLimit(500);
//FindAs
MongoCursor<Subscriber> cursor2 = Context.General.FindAs<Subscriber>(query);
}
Кто-нибудь может дать некоторые идеи?