2015-05-14 5 views
1

(простите мой newbiness.) Если даны следующие классы, как бы вы.Net MongoDB Driver субколлекций, строителей, и Проекции

  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; 
} 

Помимо каких-либо проблем компилировать там может быть, это неправильно/правильный подход к Монго?

Как получить список транзакций, где ItemId == x проецируется в TransactionDTO, используя класс Builders, указанный в драйвере mongo.

Это то, куда я направляюсь, но я столкнулся с некоторыми дорожными блоками.

для запроса основной коллекции (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

Я думаю, что вы ищете является использование агрегата. Использование коллекции вы должны быть в состоянии сделать что-то подобное следующему

Если у вас есть следующие классы и хотите отобразить в 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». после того, как у меня есть результаты, я хочу сопоставить его с третьим классом. что сложно только из-за массива объектов. концептуально я разворачиваю объекты, а затем запрашиваю свойство разворачиваемого объекта, а затем сопоставляю его с новым классом, который имеет свойства как от объекта внутри массива, так и от объекта, содержащего массив. –

Смежные вопросы