В настоящее время я работаю над проектом, использующим MongoDB
в качестве базы данных, и у меня возникли некоторые вопросы о том, как решить проблему наличия модели, содержащей некоторые идентификаторы для иностранных документов, и поиска их без необходимости обращаться к BsonDocument
.
Изначально у меня был этот (урезанный) класс модели:
public class TestSession
{
[BsonId]
public ObjectId Id { get; set; }
[BsonElement("taskId")]
public ObjectId? TaskId { get; set; }
}
Иногда мне нужен бетон TaskConfiguration
, на который ссылается TaskId
.
В этом случае я использую $lookup
чтобы решить это.
Сначала я представил нового члена для хранения конкретного экземпляра TaskConfiguration
, изменив класс моей модели на:
public class TestSession
{
[BsonId]
public ObjectId Id { get; set; }
[BsonElement("taskId")]
public ObjectId? TaskId { get; set; }
[BsonIgnore]
public TaskConfiguration Task { get; set; }
}
Затем я понял, что агрегация не может десериализовать искомый иразмотал Task
значение, я думаю, из-за BsonIgnore
.
Я не мог найти никаких вариантов, чтобы переопределить это, и я не мог придумать никакого другого решения для этого.
Наконец я решилразделить класс модели на исходный, содержащий точно представление базы данных документа и производный класс, содержащий разрешенный Task
член без атрибута BsonIgnore
, чтобы его можно было десериализовать.
Полученные классывыглядят так:
public class TestSessionModel
{
[BsonId]
public ObjectId Id { get; set; }
[BsonElement("taskId")]
public ObjectId? TaskId { get; set; }
}
public class TestSession : TestSessionModel
{
[BsonElement("task")]
public TaskConfiguration Task { get; set; }
}
Хотя этот подход, кажется, работает, я теперь должен разделить все похожие классы, которые не только потенциально создают много классов, но и потенциально могут запутать читателя, какой класс использовать.
Кроме того, следует соблюдать осторожность, чтобы не сохранять производные классы в базе данных.
Мой вопрос сейчас заключается в том, является ли мой нынешний подход действительно подходом в этом случае, или есть ли лучшие / более безопасные альтернативы?