使用c# Driver 2.1.1,在MongoDb集合中存储的对象的最大大小是多少?

本文关键字:对象 多少 存储 Driver 集合 MongoDb 使用 | 更新日期: 2023-09-27 17:54:43

我使用mongoDB c#驱动程序2.1.1来存储和检索mongoDB集合中的文档。直到有一个文档被正确地存储,但是不能被驱动程序读回,这个方法到目前为止运行良好。

我是通过使用robomongo(一种监视我的集合中的内容的用户界面)和操作存储的对象得出这个结论的。它包含一个元素集合(大约4000个子元素),如果我删除足够的元素,文档最终可以再次检索。

使用的代码行是:

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

在你问之前,我首先想到的是我的子元素集中的一个特定元素在序列化/反序列化时遇到了一些问题,并且正在产生问题。我通过删除集合中的随机元素进行测试,而数字似乎是问题的根源。

Json文档的文本文件大小约为11mb -我现在将尝试获得对象的实际大小,这将更相关。

我可以添加的其他内容是,在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个int型和1个对象属性的容器。还在找东西呢:)

编辑2:我只使用mongoDb c#驱动程序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方法不再工作,因为该方法使用过滤器仍然可以检索文档。

使用c# Driver 2.1.1,在MongoDb集合中存储的对象的最大大小是多少?

c# mongodb驱动程序2.2.4版修复问题(可能伴有https://jira.mongodb.org/browse/CSHARP-1645错误)

谢谢:)