(原谅我的新生。)如果给出以下课程你将如何
类:
public class Customer{
public ObjectId Id;
public string FirstName;
public string LastName;
.
.
. (Other Properties specific to the customer profile)
public IEnumerable<Transaction> Transactions;
}
public class Transaction{
public ObjectId ItemId;
public DateTime PurchaseDate;
.
.
. (etc.)
}
public class TransactionDTO{
public ObjectId CustomerId;
public string FirstName;
public ObjectId ItemId;
public DateTime PurchaseDate;
}
除了可能存在的任何编译问题,这是mongo的错误/正确方法吗?
如何使用mongo驱动程序中提供的Builders类获取ItemId == x投射到TransactionDTO的事务列表。
这是我要去的地方,但我遇到了一些路障。
在特定属性上查询主集合(Customer),您可以构建查询,如下所示:
Builders<Customer>.Filter.Eq(c=>c.firstname,"Bob");
但是使用这种语法我无法查询子集合。
Builders<Customer>.Filter.Eq(c=>c.Transactions....????, "match condition");
那么查询的正确方法是什么?同样,投影看起来像这样:
Builders<Customer>.Projection.Expression(c=> new TransactionDTO(){
CustomerId = x.Id,
FirstName = x.FirstName, // <- these should be fine.
itemId = x.Transaction...???
PurchaseDate = x.Transaction....???
})
答案 0 :(得分:1)
我认为您正在寻找的是使用聚合。使用Collection您应该可以执行类似于以下内容的操作
假设您有以下类并想要映射到MainWithSub
public class MainClass
{
public ObjectId Id { get; set; }
public string PropOne { get; set; }
public string PropTwo { get; set; }
public List<SubClass> subClasses { get; set; }
}
public class SubClass
{
public string PropThree { get; set; }
}
public class MainWithSub
{
public ObjectId Id { get; set; }
public string PropOne { get; set; }
public string PropTwo { get; set; }
public string PropThree { get; set; }
}
然后,您可以使用您的收藏集进行以下调用
Collection.Aggregate()
.Match(t => t.Id == new ObjectId())
.Unwind<MainClass, MainWithSub>(t => t.subClasses)
.Match(t => t.PropThree == "filter");
这将返回一个在on propthree中过滤的MainWithSub(一个扁平版本)类的列表