.Net MongoDB驱动程序子集合,构建器和预测

时间:2015-05-14 15:59:13

标签: c# .net mongodb

(原谅我的新生。)如果给出以下课程你将如何

  1. 查询子集合的属性。 (尽可能避免字符串)
  2. 投影并将结果映射到给定的DTO?
  3. 类:

    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....???
    })
    

    Mongo C# Docs

1 个答案:

答案 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(一个扁平版本)类的列表