可查找模型

我目前正在使用一个MongoDB作为数据库的项目,而我遇到了一些问题,该问题涉及如何解决使模型包含一些外国文档ID并查找它们而无需回退的问题到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; }
}

尽管这种方法似乎可行,但我现在必须拆分所有类似的类,这不仅可能创建许多类,而且还可能使读者混淆使用哪种类。
另外,必须小心不要将派生的类存储到数据库中。

我现在的问题是,在这种情况下,我当前的方法是否确实是可行的方法?或者是否有更好/更安全的替代方法?

qq88744875q 回答:可查找模型

您可以使用BsonIgnore方法来做到这一点,但是您需要这样投影最终结果:

var res = collection.AsQueryable()
                    .Where(t => t.Id == session.Id)
                    .Join(
                        foreignColl.AsQueryable(),// foreign collection
                        s => s.TaskId,// local field
                        c => c.Id,// foreign field
                        (s,c) => new TestSession  // projection
                        {
                            Id = s.Id,Name = s.Name,TaskId = s.TaskId,Task = c
                        })
                    .Single();

这是我用于测试的完整程序:

using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Entities;
using MongoDB.Entities.Core;
using System.Linq;

namespace StackOverflow
{
    public class TestSession : Entity
    {
        public string Name { get; set; }

        [BsonRepresentation(BsonType.ObjectId)]
        public string TaskID { get; set; }

        [BsonIgnore]
        public TaskConfiguration Task { get; set; }
    }

    public class TaskConfiguration : Entity
    {
        public int NumOfIterations { get; set; }
    }

    public static class Program
    {
        private static void Main()
        {
            new DB("test");

            var task = new TaskConfiguration { NumOfIterations = 10 };
            task.Save();

            var session = new TestSession { Name = "This is a test session",TaskID = task.ID };
            session.Save();

            var res = DB.Queryable<TestSession>()
                        .Where(t => t.ID == session.ID)
                        .Join(
                            DB.Queryable<TaskConfiguration>(),s => s.TaskID,c => c.ID,(s,c) => new TestSession
                            {
                                ID = s.ID,TaskID = s.TaskID,Task = c
                            })
                        .Single();
        }
    }
}

本文链接:https://www.f2er.com/3144693.html

大家都在问