Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance MongoDB模式性能优化_Performance_Mongodb - Fatal编程技术网

Performance MongoDB模式性能优化

Performance MongoDB模式性能优化,performance,mongodb,Performance,Mongodb,您好,我想构建性能最高的mongoDB模式 一般来说,我的问题是: 什么更好: 包含巨大子文档数组的集合(大约10000个)或包含引用的两个独立集合(其中一个可能包含50000000条记录) 详细资料 我有一个包含复杂子文档的mongoDB模型 var usersSchema = new Schema({ email:{ type: String, unique: true, required: true }, packages : [{ package : {t

您好,我想构建性能最高的mongoDB模式

一般来说,我的问题是:

什么更好: 包含巨大子文档数组的集合(大约10000个)或包含引用的两个独立集合(其中一个可能包含50000000条记录)

详细资料

我有一个包含复杂子文档的mongoDB模型

var usersSchema = new Schema({
email:{
    type: String,
    unique: true,
    required: true
},
packages : [{
    package : {type: Schema.Types.ObjectId, ref: 'Packages'},
    from : {type : Schema.Types.ObjectId, ref :'Languages'},
    to : {type : Schema.Types.ObjectId, ref :'Languages'},
    words : [{
        word: {type: String},
        progress: {type: Number,default : 0}
    }]
}]
});
每个用户可能会有3-10个1000字的软件包。 应用程序可能会有超过10000个用户。 所以我可能会储存大约50000字。 但是我很想为collectionWord提供分页、普通搜索和另一个有趣的mongoDB功能。但据我所知,在子文档中使用这些函数非常困难

var usersSchema = new Schema({
email:{
    type: String,
    unique: true,
    required: true
},
packages : [{
    package : {type: Schema.Types.ObjectId, ref: 'Packages'},
    from : {type : Schema.Types.ObjectId, ref :'Languages'},
    to : {type : Schema.Types.ObjectId, ref :'Languages'},
    words : [{
        word: {type: String},
        progress: {type: Number,default : 0}
    }]
}]
});
我的问题是:如果分页、搜索和更新无效,但被用户划分为一个具有50000条记录的独立模型,那么对于系统性能子文档来说,什么更好? 像这样的

var wordsSchema = new Schema({
      word: {type: String},
      progress: {type: Number,default : 0},
      user : {type : Schema.Types.ObjectId, ref :'Users'}
  }]
});

根据我的意见,分开收集比较好

记住几件事

  • 单个文档的最大大小为16 MB
  • 不要忘记创建索引(将提高查询性能)
  • 如果您使用的是MongoDB 3.0或更高版本,则可以使用wiredtiger存储引擎

  • 希望能有所帮助,因为我认为分开收藏更好

    记住几件事

  • 单个文档的最大大小为16 MB
  • 不要忘记创建索引(将提高查询性能)
  • 如果您使用的是MongoDB 3.0或更高版本,则可以使用wiredtiger存储引擎

  • 希望能有所帮助,因为我认为分开收藏更好

    记住几件事

  • 单个文档的最大大小为16 MB
  • 不要忘记创建索引(将提高查询性能)
  • 如果您使用的是MongoDB 3.0或更高版本,则可以使用wiredtiger存储引擎

  • 希望能有所帮助,因为我认为分开收藏更好

    记住几件事

  • 单个文档的最大大小为16 MB
  • 不要忘记创建索引(将提高查询性能)
  • 如果您使用的是MongoDB 3.0或更高版本,则可以使用wiredtiger存储引擎
  • 希望能有所帮助

    更好的方法是:包含巨大子文档数组的集合(大约10000个)或包含引用的两个独立集合(其中一个可能包含50000000条记录)

    这里首先想到的是:为什么存储一个引用的成本是存储在子文档中的成本的5000倍

    好的,看看你的模式,我相信最好的方法是单独收集单词,而不是包

    我看到的第一个危险信号是你在这里的双重筑巢:

    packages : [{
        package : {type: Schema.Types.ObjectId, ref: 'Packages'},
        from : {type : Schema.Types.ObjectId, ref :'Languages'},
        to : {type : Schema.Types.ObjectId, ref :'Languages'},
        words : [{
            word: {type: String},
            progress: {type: Number,default : 0}
        }]
    }]
    
    在当前版本的MongoDB中,
    words
    子文档将很难使用,通常2-3级深度开始出现问题,尤其是位置运算符

    现在,考虑到您应该始终从最高可能值开始工作,您可以在此处获得:

    每个用户可能会有3-10个1000字的软件包

    <>你也要考虑这个文件的住房成本。您需要的运算符将在内存中,如“代码> $PLAU/<代码>、<代码> $PUT/<代码>、<代码> $AdStoTe> <代码>等,这意味着整个文档需要被序列化并加载到MunGDB的本机C++结构中。这将是一项非常耗时的任务,具体取决于这些文档的流量

    var usersSchema = new Schema({
    email:{
        type: String,
        unique: true,
        required: true
    },
    packages : [{
        package : {type: Schema.Types.ObjectId, ref: 'Packages'},
        from : {type : Schema.Types.ObjectId, ref :'Languages'},
        to : {type : Schema.Types.ObjectId, ref :'Languages'},
        words : [{
            word: {type: String},
            progress: {type: Number,default : 0}
        }]
    }]
    });
    
    考虑到你的评论:

    我想用word集合做很多读写操作,更不用说用户集合了

    它只不过是在主用户文档中嵌入这些单词的棺材上钉上了另一颗钉子。考虑到我在上一段中所说的,这与在
    单词
    数组上使用内存中运算符的成本不符

    但我希望有分页,正常搜索和另一个有趣的mongoDB功能来收集单词

    如果将单词拆分,这将更好地工作,
    $slice
    也是内存中的运算符,可能会降低性能

    这是一个快速合理的回答。我相信我还有更多的理由可以解释,但这应该足够了

    更好的方法是:包含巨大子文档数组的集合(大约10000个)或包含引用的两个独立集合(其中一个可能包含50000000条记录)

    这里首先想到的是:为什么存储一个引用的成本是存储在子文档中的成本的5000倍

    好的,看看你的模式,我相信最好的方法是单独收集单词,而不是包

    我看到的第一个危险信号是你在这里的双重筑巢:

    packages : [{
        package : {type: Schema.Types.ObjectId, ref: 'Packages'},
        from : {type : Schema.Types.ObjectId, ref :'Languages'},
        to : {type : Schema.Types.ObjectId, ref :'Languages'},
        words : [{
            word: {type: String},
            progress: {type: Number,default : 0}
        }]
    }]
    
    在当前版本的MongoDB中,
    words
    子文档将很难使用,通常2-3级深度开始出现问题,尤其是位置运算符

    现在,考虑到您应该始终从最高可能值开始工作,您可以在此处获得:

    每个用户可能会有3-10个1000字的软件包

    <>你也要考虑这个文件的住房成本。您需要的运算符将在内存中,如“代码> $PLAU/<代码>、<代码> $PUT/<代码>、<代码> $AdStoTe> <代码>等,这意味着整个文档需要被序列化并加载到MunGDB的本机C++结构中。这将是一项非常耗时的任务,具体取决于这些文档的流量

    var usersSchema = new Schema({
    email:{
        type: String,
        unique: true,
        required: true
    },
    packages : [{
        package : {type: Schema.Types.ObjectId, ref: 'Packages'},
        from : {type : Schema.Types.ObjectId, ref :'Languages'},
        to : {type : Schema.Types.ObjectId, ref :'Languages'},
        words : [{
            word: {type: String},
            progress: {type: Number,default : 0}
        }]
    }]
    });
    
    考虑到你的评论:

    我想用word集合做很多读写操作,更不用说用户集合了

    它只不过是在主用户文档中嵌入这些单词的棺材上钉上了另一颗钉子。