C# MongoDb driver include child object
我是 Mongo 的新手,我有一个项目使用 C# MongoDb 驱动程序和 Linq 从 MongoDb 检索数据。
我有一个名为 Instance 的对象,我可以从 Mongo 集合中检索它。但是,对象的 Template 属性属于单独的集合,在查询 Instance 集合时为 null。我想在查询实例时急切加载模板数据。
这相当于 Entity Framework 的 Include 方法,它急切地加载相关实体。我已经在网上搜索了使用 C# Mongo 驱动程序的等效方法,但没有运气。
如何使用 C# MongoDb 驱动程序和 Linq 完成此操作?
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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() |
- 你如何检索 instances 集合?
- @dododo 我已经更新了帖子,我用它来获取集合:MongoDatabase.GetCollection<Instance>(“Instances”).AsQueryab??le()
- 由于 Template 是一个单独的集合,因此您需要将 lookup 用于您的目标:stackoverflow.com/questions/35638372/…
- @dododo 同意。但是,这是投影到匿名类型。 mongodb.github.io/mongo-csharp-driver/2.2/reference/driver/c??rud/… 我需要将数据返回为 Instance 类型(在这种情况下)。我希望有一些更灵活的东西也可以用于其他不同类型的集合(例如 Order => OrderDetail),而无需手动预测。
你可以像这样进行类型查找>
1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
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
string connectionString =“mongodb://localhost:27017”; var db = client.GetDatabase(“test”); |
编辑:
展开 jcruz 编辑的部分。
- 这似乎很有希望。由于某种原因,无参数 Aggregate 方法仅适用于 IMongoCollection<T>,我无法从 MongoCollection<T> 进行转换。有什么建议?
- 有哪些版本?
- v2.2 api.mongodb.com/csharp/2.2/html/…
- 我想通了,我使用的是 MongoServer 而不是 MongoClient。但是,您的解决方案返回一个模板数组,其中我需要一个对象(我无法更改它),所以我收到以下错误:”预期一个嵌套文档表示 Namespace.Template 值的序列化形式,但发现而是一个 Array 类型的值。”。有什么方法可以调整它以返回单个模板对象?
- 我能够使用 Unwind 返回单个 Template 对象。我将我的编辑添加到您的答案中。感谢您的帮助!!!
来源:https://www.codenong.com/58625750/