2016-06-14 2 views
1

Я полностью потерял выполнение CRUD и других операций над элементами массива во встроенном массиве mongodb с использованием драйверов C#.mongodb .net driver V2: Как выполнить операции с массивом

учитывая У меня есть следующие классы (простой пример):

public class Child 
{ 
    public ObjectId Id; 
    public DateTime dateOfBirth; 
    public string givenName; 
} 


class Family 
{ 
    public ObjectId Id; 
    public string name; 
    public List<Child> children; 
} 

Моя коллекция должна хранить семейные документы.

Как:

  1. Добавить новый ребенок в семью
  2. Удаления определенного ребенка
  3. Update один Child
  4. Количество детей одной семьи
  5. получить младший ребенок семьи
  6. Нагрузка одного конкретного ребенка

без загрузки всей семьи объекта

Хотя я принимаю участие в классе университета Монго mongo.net Я полностью потерянным и документация по работе с массивами практически не существует.

Я знаю, что получил ответы на 1-4:

//Add child 
    families.UpdateOne(Builders<Family>.Filter.Where(x=>x.name=="Burkhart"), Builders<Family>.Update.AddToSet("children", 
     new Child() {dateOfBirth = new DateTime(2005, 4, 26), givenName = "Finn"})); 

    // Add another 
    families.UpdateOne(Builders<Family>.Filter.Where(x => x.name == "Burkhart"), Builders<Family>.Update.AddToSet("children", 
     new Child() { dateOfBirth = new DateTime(2007, 4, 26), givenName = "Florentina" })); 

    //remove one 
    families.UpdateOne(Builders<Family>.Filter.Where(x => x.name == "Burkhart"), 
     Builders<Family>.Update.PullFilter(c => c.children, m => m.givenName == "Florentina")); 

    //update one 
    families.UpdateOne(Builders<Family>.Filter.Where(x => x.name == "Burkhart" && x.children.Any(c => c.givenName =="Finn")), 
         Builders<Family>.Update.Set(x=> x.children[-1].givenName,"Finn Linus")); 

    //count children 
    var numberOfChildren = 
     families.Aggregate() 
      .Match(f => f.name == "Burkhart") 
      .Project(new BsonDocument("count", new BsonDocument("$size", "$children"))) 
      .FirstOrDefault() 
      .GetValue("count") 
      .ToInt32(); 
+0

вы можете скачать драйвер Монго из GitHub и посмотреть тесты -> примеров – profesor79

+0

Я сделал это, но нет примеров для моих вопросов – Thomas

+0

, что странно '[Факт] общественных недействительными AddToSetEach_Typed() { var subject = CreateSubject (); Assert (subject.AddToSetEach (x => x.FavoriteColors, new [] {"green", "violet"}), "{$ addToSet: {colors: {$ each: ['green', 'violet'] }}} "); Assert (subject.AddToSetEach ("FavoriteColors", new [] {"green", "violet"}), "{$ addToSet: {colors: {$ each: ['green', 'violet']}}}"); } ' – profesor79

ответ

2

в 1-4 фиксировалась вас - поздравляем! Пожалуйста, найдите 5 и 6, как описано в чате.

Полный код в этом GitHub repository

 var f = GenerateFaimly(); 
     collection.InsertOne(f); 

     var sort = BsonDocument.Parse("{\"kids.dateOfBirth\": -1}"); // get the youngest 
     var project = 
      BsonDocument.Parse(
       "{_id:'$children._id', dateOfBirth:'$children.dateOfBirth', givenName:'$children.givenName', IsAlive:'$children.IsAlive'}"); 
     var aggregate = collection.Aggregate().Match(x => x.Id == f.Id) 

      // .Project(x => new { kids = x.children }) 
      .Unwind("children").Sort(sort).Limit(1).Project<Child>(project); 

     Console.WriteLine(aggregate.ToString()); 

     var result = aggregate.FirstOrDefault(); 

     var pojectionIsAlive = 
      BsonDocument.Parse(
       "{_id:1, name:1, children:{$filter:{ input:'$children', as:'kids', cond:{$eq:['$$kids.IsAlive', true]}}}}"); 

     var kids = collection.Aggregate().Match(x => x.Id == f.Id).Project<Family>(pojectionIsAlive).ToList(); 
+0

Я просто попробовал еще раз, и оба они еще не работают. В поисках самого молодого не возвращается Ребенок 4, как ожидалось, но ребенок 1 И выбор одного ребенка тоже не работает :-( – Thomas

+0

это странно - повторил тест и получил ребенка нет 4 :( – profesor79

+0

Просто загрузил снимок экрана в чат , Я по-прежнему удивляюсь, что приведенный выше код работает на вашей стороне, при моем я получаю исключение, когда RegisterClassMap не помещается в самом начале. – Thomas

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