2016-07-05 2 views
1

Я использую драйвер mongoDB C# 2.1.1 для хранения и извлечения документов в коллекции mongoDb. Это хорошо работало до тех пор, пока один документ не был ПРАВИЛЬНО сохранен, но не может быть прочитан драйвером.Каков максимальный размер объекта для хранения в коллекции MongoDb с использованием драйвера C# 2.1.1?

Я пришел к такому выводу, используя robomongo (пользовательский интерфейс для контроля того, что находится внутри моей коллекции) и манипулирование хранящимся объектом. Он содержит набор элементов (около 4000 подэлементов), и если я удалю его достаточно, документ, наконец, будет снова восстановлен.

Строка кода используется:

public Task<T> FirstOrDefaultAsync(Expression<Func<T, bool>> predicate, CancellationToken cancellationToken = default(CancellationToken)) 
    { 
     return MongoQueryable.FirstOrDefaultAsync(_collection, predicate, cancellationToken); 
    } 

Прежде чем спросить, что я первая мысль, что один конкретный элемент из моих вспомогательных элементов, установленных уже возникли некоторые проблемы, в то время как сериализовано/десериализации и создавал проблемы , Я тестировал, удаляя случайные элементы коллекции, и просто число кажется корнем проблемы.

Размер текстового файла документа Json составляет около 11 Мб - я попытаюсь теперь получить фактический размер объекта, который будет более уместным.

Что еще я могу добавить, что в лог-файл mondoDb, есть одна линия, которая появляется только тогда, когда я пытаюсь выбрать «негабаритный» документ:

2016-06-29T19:30:45.982+0200 I COMMAND [conn12] command MYCOLLECTIONDb.$cmd command: aggregate 
{ aggregate: "XXXX", pipeline: [ { $match: { _id: "5773e0e9a1152d259c7d2e50" } }, { $limit: 1 } ] 
, cursor: {} } keyUpdates:0 writeConflicts:0 numYields:0 reslen:4188200 locks:{ Global: 
{ acquireCount: { r: 6 } }, MMAPV1Journal: { acquireCount: 
{ r: 3 } }, Database: { acquireCount: { r: 3 } }, Collection: { acquireCount: { R: 3 } } } 109ms 

(XXXX быть мой пользовательский объект)

Так что я хотел бы знать, если у вас есть какие-либо идеи о том, что вызывает этот вопрос, любой намек где я должен попытаться посмотреть, потому что я бегу из идей :)

EDIT_1: это в основном структура моего объекта:

[DataContract] 
public class MyClass 
{ 
    [DataMember] 
    public string _id { get; set; } 

    [DataMember] 
    public string XmlPreference { get; set; } 

    [DataMember] 
    public string XmlMarketDates { get; set; } 

    [DataMember] 
    public IEnumerable<ClassB> Lines { get; set; } 
} 

[DataContract] 
public class ClassB 
{ 
    [DataMember] 
    public string UniqueId { get; set; } 

    [DataMember] 
    public string ParentId { get; set; } 

    [DataMember] 
    public Dictionary<string, ClassC> DataMapping {get; set;} 
} 

и ClassC - это всего лишь контейнер из 7 объектов и 1 объект. Все еще ищете что-то :)

EDIT 2: Я воспроизвел ошибку только с помощью версии mongoDb C# drivers 2.1.1. Вот код:

using MongoDB.Bson; 
using MongoDB.Driver.Linq; 
using MongoDB.Driver; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.Text; 
using System.Threading.Tasks; 

namespace TestingMongoDbCsharpDriver 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Console.WriteLine("Debugging starting..."); 

      try 
      { 
       MongoDB.Driver.MongoClient myClient = new MongoDB.Driver.MongoClient("mongodb://localhost:27010"); 
       var db = myClient.GetDatabase("DocumentStoreDb"); 
       var collection = db.GetCollection<DocumentModel>("TestOverload"); 

       Console.WriteLine("Collection TestOverload found"); 


       Random rand = new Random(999999999); 
       DocumentModel toInsert = null; 
       for (int lineNb = 1; lineNb < 50000; lineNb += 1000) 
       { 
        string id = rand.Next().ToString(); 
        Console.WriteLine(string.Format("\nCreating document with id '{0}' and {1} lines...", id, lineNb)); 
        toInsert = Funcs.Create(id, lineNb); 
        Console.WriteLine("Created."); 

        // Saving and waiting for it to finish 
        collection.InsertOneAsync(toInsert).Wait(); 
        Console.WriteLine("Inserted."); 

        // retrieving it 
        var filter = new BsonDocument("_id", new BsonDocument("$eq", id)); 

        var cursor = collection.FindAsync<DocumentModel>(filter).Result;      
        cursor.MoveNextAsync().Wait(); 
        string messFilterMethod = cursor.Current.Count() == 1 ? "Retrieved" : "Not retrieved. Bug confirmed"; 
        Console.WriteLine("With Filter: " + messFilterMethod); 

        var model = MongoQueryable.FirstOrDefaultAsync(collection.AsQueryable(), e => e._id == id).Result; 
        string mess = model != null ? "Retrieved" : "Not retrieved. Bug confirmed"; 
        Console.WriteLine("With AsQueryable: " + mess); 

        // Removing it 
        collection.DeleteOneAsync(filter).Wait(); 
        Console.WriteLine("Deleted.\n"); 

        Console.ReadKey(); 
       } 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine("\n\nERROR: " + e.Message); 
      } 
      Console.WriteLine("\n\n**************** NO BUG *************\n"); 
     } 

    } 


    public static class Funcs 
    { 
     public static DocumentModel Create(string uniqueId, int nbLines) 
     { 
      Random random = new Random(2000000); 
      List<MyDocumentSubElement> listOk = new List<MyDocumentSubElement>(); 

      for (int lines = 0; lines < nbLines; ++lines) 
      { 
       Dictionary<string, SnapCellValueStyle> newDico = new Dictionary<string, SnapCellValueStyle>(); 
       for (int i = 0; i < 10; ++i) 
       { 
        int idSnap = random.Next(); 
        var snap = new SnapCellValueStyle() 
        { 
         alignment = idSnap, 
         Value = "okkkkkkkkkkzzzzkk" 
        }; 
        newDico.Add("newKey_" + idSnap.ToString(), snap); 
       } 

       MyDocumentSubElement doc = new MyDocumentSubElement() 
       { 
        Icon = 516, 
        Name = "name du truc", 
        ParentId = "parent id", 
        type = SubElementType.T3, 
        UniqueId = "uniqueId_" + random.Next().ToString(), 
        MapColumnNameToCellValue = newDico 
       }; 
       listOk.Add(doc); 
      } 

      int headerId = random.Next(); 
      MyDocumentHeader temp = new MyDocumentHeader() 
      { 
       Comment = "comment", 
       Date = DateTime.Now, 
       ExtractionId = headerId, 
       Id = "id ok _ " + headerId, 
       Name = "Name really interesting name", 
       OwnerId = 95115, 
       RootFolioId = 51, 
       SnapshotViewId = MyDocumentType.Type2 
      }; 

      DocumentModel toInsert = new DocumentModel() 
      { 
       _id = uniqueId, 
       Header = temp, 
       XmlMarketDates = "<xmlPrefok65464f6szf65ze4f6d2f1ergers5fvefref3e4f05e4f064z68f4xd35f8eszf40s6e40f68z4f0e8511xf340ed53f1d51zf68d4z61ef644dcdce4f64zef84zOKok>><>>", 
       XmlPreference = "<<zefaiunzhduiaopklzpdpakzdplapdergergfdgergekâzda4684z16ad84s2dd0486za04d68a04z8d0s1d d4az80d46az4d651s1d8 154efze40f6 4ze65f40 65ze40f6z4e>><>>>", 
       Lines = listOk 
      }; 

      return toInsert; 
     } 
    } 

    // Imitation of SnapshotDocModel 
    [DataContract] 
    public class DocumentModel 
    { 
     [DataMember] 
     public string _id { get; set; } 

     [DataMember] 
     public MyDocumentHeader Header { get; set; } 

     [DataMember] 
     public string XmlPreference { get; set; } 

     [DataMember] 
     public string XmlMarketDates { get; set; } 

     [DataMember] 
     public IEnumerable<MyDocumentSubElement> Lines { get; set; } 
    } 

    [DataContract] 
    public class MyDocumentHeader 
    { 
     [DataMember] 
     public string Id { get; set; } 
     [DataMember] 
     public string Name { get; set; } 
     [DataMember] 
     public int OwnerId { get; set; } 
     [DataMember] 
     public string Comment { get; set; } 
     [DataMember] 
     public DateTime Date { get; set; } 
     [DataMember] 
     public int RootFolioId { get; set; } 
     [DataMember] 
     public MyDocumentType SnapshotViewId { get; set; } 
     [DataMember] 
     public int ExtractionId { get; set; } 
    } 

    [DataContract] 
    public class MyDocumentSubElement 
    { 
     [DataMember] 
     public string UniqueId { get; set; } 

     [DataMember] 
     public string ParentId { get; set; } 

     [DataMember] 
     public int Icon { get; set; } 

     [DataMember] 
     public SubElementType type { get; set; } 

     [DataMember] 
     public Dictionary<string, SnapCellValueStyle> MapColumnNameToCellValue { get; set; } 

     [DataMember] 
     public string Name { get; set; } 
    } 

    public class SnapCellValueStyle 
    { 
     public object Value { get; set; } 
     public int alignment { get; set; } 
     public int Red { get; set; } 
     public int Green { get; set; } 
     public int Blue { get; set; } 
     public int currency { get; set; } 
     public int decimalPoint { get; set; } 
     public int kind { get; set; } 
     public int style { get; set; } 
    } 

    #region enum 
    public enum MyDocumentType 
    { 
     Undefined, 
     Type1, 
     Type2, 
     Type3, 
     Type4, 
     Type5 
    } 

    public enum SubElementType 
    { 
     T1, 
     T2, 
     T3 
    } 
    #endregion 
} 

Если вы проверить это, вы увидите, что есть точка, в которой метод AsQueryable больше не работает, где, как документ еще извлекаемый методом с использованием фильтра.

+0

вы могли бы разместить структуру документа (Barebone)? Попробуем воспроизвести это с помощью драйвера 2.2.4 – profesor79

+0

Может быть, эта ошибка: я не помню, чтобы точное число, необходимое для этой ошибки, попало. Обновите версию 2.2.4 и проверьте, не исчезла ли проблема. https://jira.mongodb.org/browse/CSHARP-1607 –

+0

@ profesor79 как предложил Крейг Уилсон, это может быть связано с версией драйвера. Я попробую с новым и посмотрю, как это происходит! Если это неуспешно, я опубликую общую версию своего класса :) – Flo

ответ