Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.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
MongoDB文档模型大小/性能限制?一个对象可能包含10万个+;名字?_Mongodb - Fatal编程技术网

MongoDB文档模型大小/性能限制?一个对象可能包含10万个+;名字?

MongoDB文档模型大小/性能限制?一个对象可能包含10万个+;名字?,mongodb,Mongodb,我正试图建立一个活动网站,将主办视频等。我已经用事件名称、事件描述和一个对象建立了一个集合,其中包含一些“参与”人员的友好信息。如果事情进展顺利,可能会有10-20万人参加,这些人应该可以接触其他人。(点击友好的名字会找到用户的id,然后找到他们的完整资料)这是不是对mongo要求太高了?还是有更好的方法来做类似的事情?看起来这可能会很快变得很大 { _id : ...., // event Id, 'name' : // event name 'description

我正试图建立一个活动网站,将主办视频等。我已经用事件名称、事件描述和一个对象建立了一个集合,其中包含一些“参与”人员的友好信息。如果事情进展顺利,可能会有10-20万人参加,这些人应该可以接触其他人。(点击友好的名字会找到用户的id,然后找到他们的完整资料)这是不是对mongo要求太高了?还是有更好的方法来做类似的事情?看起来这可能会很快变得很大

{
    _id : ...., // event Id,
    'name' :  // event name
    'description' : //event description
    'attendees' :{
        {'username': user's friendly name, 'avatarlink': avatar url},
        {'username': user's friendly name, 'avatarlink': avatar url},
        {'username': user's friendly name, 'avatarlink': avatar url},
        {'username': user's friendly name, 'avatarlink': avatar url}
    }
}

谢谢你的建议

> P>也许你应该考虑在两个集合中建模你的数据,而事件文档中的与会者字段将是一个用户ID数组。 下面是该模式的一个示例:

db.events

{
    _id : ...., // event Id,
    'name' :  // event name
    'description' : //event description
    'attendees' :[ObjectId('userId1'), ObjectId('userId2') ...]
}
数据库用户

{
    _id : ObjectId('userId1'),
    username: 'user friendly name',
    avatarLink: 'url to avatar'
}
然后您可以执行两个单独的查询

db.events.find({_id: ObjectId('eventId')});
db.users.find( {_id: {$in: [ObjectId['userId1'), ObjectId('userId2')]}});

一般来说,在MongoDB多对多建模(或一对多)中,您应该采取不同的方法,具体取决于多是少(通常最多几十个)还是“真的”

最好不要在您的案例中使用嵌入,而是规范化。如果在事件集合中嵌入用户,则向特定事件添加与会者将增加阵列大小。由于文档是就地更新的,如果文档不能适应其磁盘大小,它将不得不在磁盘上移动,这是一项非常昂贵的操作,还会导致碎片。有很多方法可以处理这些动作,但没有一个是理想的

拥有一系列的
ObjectId
作为与会者会更好,因为文档的增长不会太快,但仍然会出现一些问题。您将如何查找用户参与的所有事件?您可以为与会者提供多键索引,但一旦某个文档移动,该索引必须根据每个用户条目进行更新(该索引包含指向磁盘上文档位置的指针)。在你的情况下,如果你计划拥有20万用户,那将是非常痛苦的

嵌入是MongoDB或任何其他面向文档的数据库的一个非常酷的特性,但如果认为它(有时)不是免费的,那就太天真了

我认为您应该重新思考您的模式:拥有一个事件集合、一个用户集合和一个用户事件集合,其结构类似于:

{
     _id : ObjectId(),
     user_id : ObjectId(),
     event_id : ObjectId()
}

规范化不是一个肮脏的词

,所以我已经有了一个用户集合。我只存储用户名和头像url,因为这在事件视图中是可用的。在观看活动时,你应该能够看到参加的人。如果他们选择了解有关该用户的更多信息,那么他们可以单击他们的姓名,这将搜索该姓名的用户名并返回整个配置文件。我最初的想法是,如果你只想了解与会者的基本情况,就不必再提出另一个问题。这是否有助于或改变你的建议?这也是我的第一个想法,但我对Mongo世界还是新手,不确定这是否违背了这个概念。你是对的,但这可以很快变成一个大的多对多关系。我已经有了一个用户集合,如果有人观看了活动,他们可以点击一个名字,然后搜索id并填写档案的其余部分。我最初的想法是,如果事件视图中所需的一切都在事件对象中可用,那么事情会变得更容易,但我认为我同意您的看法,需要对其进行细分。谢谢