【问题标题】:C# MongoDb driver include child objectC# MongoDb 驱动程序包含子对象
【发布时间】:2019-10-30 12:48:05
【问题描述】:

我是 Mongo 的新手,有一个项目使用 C# MongoDb driver 和 Linq 从 MongoDb 检索数据。

我有一个名为 Instance 的对象,我可以从 Mongo 集合中检索到它。但是,对象的Template 属性属于单独的集合,在查询Instance 集合时为null。我想在查询实例时预先加载模板数据。

这相当于 Entity Framework 的 Include 方法,它急切地加载相关实体。我已经在网上搜索了使用 C# Mongo 驱动程序的等效方法,但没有运气。

如何使用 C# MongoDb 驱动程序和 Linq 完成此操作?

public class Instance
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? TemplateId { get; set; }
    public Template Template { get; set; }
}
public class Template
{
    public int Id { get; set; }
    public string Name { get; set; }
}

var collection = MongoDatabase.GetCollection<Instance>("Instances").AsQueryable()
var instance = collection.First(i => i.Id == 1);
var template = instance.Template; //always null

【问题讨论】:

  • 如何检索instances 收藏?
  • @dododo 我已经更新了帖子,我用它来获取收藏:MongoDatabase.GetCollection&lt;Instance&gt;("Instances").AsQueryable()
  • 由于Template是一个单独的集合,你需要使用lookup作为你的目标:stackoverflow.com/questions/35638372/…
  • @dododo 同意。但是,这是投影到匿名类型。 mongodb.github.io/mongo-csharp-driver/2.2/reference/driver/crud/… 我需要将数据作为Instance 类型返回(在这种情况下)。我希望有一些更灵活的东西也可以用于其他不同类型的集合(例如 Order => OrderDetail),而无需手动预测。

标签: c# mongodb linq mongodb-.net-driver


【解决方案1】:

你可以像这样进行类型查找>

public class Instance
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
    public ObjectId TemplateId { get; set; }
    public Template Template { get; set; }
}

public class Template
{
    public ObjectId Id { get; set; }
    public string Name { get; set; }
}


string connectionString = "mongodb://localhost:27017";
var client = new MongoClient(connectionString);

var db = client.GetDatabase("test");
var instances = db.GetCollection<Instance>("Instances");
var resultOfJoin = instances.Aggregate()
    .Lookup("Templates", "TemplateId", "_id", @as: "Template")
    .Unwind("Template")
    .As<Instance>()
    .ToList();

编辑: 展开 jcruz 编辑的部分。

【讨论】:

  • 这看起来很有希望。出于某种原因,无参数Aggregate 方法仅适用于IMongoCollection&lt;T&gt;,我无法从MongoCollection&lt;T&gt; 转换。有什么建议吗?
  • 哪些版本?
  • 我想通了,我使用的是MongoServer 而不是MongoClient。但是,您的解决方案返回一个模板数组,我需要一个对象(我无法更改它),所以我收到以下错误:“预期一个嵌套文档表示 Namespace.Template 值的序列化形式,但找到了一个值代替数组类型。”。有什么方法可以调整它以返回单个模板对象?
  • 我能够使用Unwind 来获取返回的单个模板对象。我将我的编辑添加到您的答案中。谢谢你的帮助!!!
猜你喜欢
  • 2022-11-20
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 2016-03-13
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多