2015-05-14 59 views
1

(請原諒我的newbiness)。如果給定的一個子集合的屬性如下類別你會如何淨MongoDB的驅動子集合,建設者,和預測

  1. 查詢。 (儘可能避免字符串)
  2. 項目並將結果映射到給定的DTO?

類:

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驅動程序中提供的Builders類獲取ItemId == x投影到TransactionDTO的事務列表。

這是我前往的地方,但我遇到了一些路障。

查詢主要收集(客戶)在一個特定的屬性,你可以建立這樣的查詢:

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

我想你正在尋找的是使用的骨料。使用集合,你應該能夠做到類似以下

東西。假設你有以下類和想要映射到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"); 

這將返回您在過濾MainWithSub(扁平版)類的列表上propthree

+0

這是正確的,但不接問題的複雜性。我有一個存儲在主要集合中的對象數組,我試圖匹配它。這可能會返回許多「MainClass」對象。在我得到結果之後,我想將它映射到第三個類。這只是因爲對象的排列而變得困難。從概念上講,我展開對象,然後查詢展開對象的屬性,然後將其映射到具有來自數組內的對象和包含該數組的對象的屬性的新類。 –