【问题标题】:Using nested document structure in mongodb在 mongodb 中使用嵌套文档结构
【发布时间】:2017-04-06 14:21:26
【问题描述】:

我计划在我的 MongoDB 架构设计中使用嵌套文档结构,因为我不想进行平面架构设计,因为在我的情况下,我只需要在一个查询中获取我的结果。

由于 MongoDB 对文档有大小限制。 MongoDB Limits and Threshold

A MongoDB document has a size limit of 16MB ( an amount of data). If your subcollection can growth without limits go flat.

我不需要获取我的嵌套数据,而只需要我的嵌套数据来进行过滤和查询。

我想知道我是否仍会受到 MongoDB 大小限制的约束,即使我将嵌入数据仅用于查询和过滤目的,而从不用于获取嵌套数据,因为根据我的理解,在这种情况下, MongoDB 不会在内存中加载完整的文档,而只会加载选定的字段?

嵌套架构设计示例

{
    clinicName: "XYZ Hopital",
    clinicAddress: "ABC place.",
    "doctorsWorking":{
        "doctorId1":{
            "doctorJoined": ISODate("2017-03-15T10:47:47.647Z")
        },
        "doctorId2":{
            "doctorJoined": ISODate("2017-04-15T10:47:47.647Z")
        },
        "doctorId3":{
            "doctorJoined": ISODate("2017-05-15T10:47:47.647Z")
        },
        ...
        ...
        //upto 30000-40000 more records suppose
    }
}

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    当您说“因为根据我的理解,在这种情况下,MongoDB 不会将完整的文档加载到内存中,而只会加载选定的字段?”时,我认为您的理解不正确.

    如果我们看到MongoDB Doc。然后它读取

    最大 BSON 文档大小为 16 兆字节。最大文档大小有助于确保单个文档不会使用过多的 RAM,或者在传输期间不会使用过多的带宽。为了存储大于最大大小的文档,MongoDB 提供了 GridFS API。

    因此,文档大小的明确限制是 16 MB。 Mongo 应该阻止你保存这样一个大于这个大小的文档。

    如果我暂时同意您的理解,那么假设它允许 保存任何大小的文档,但 RAM 中不允许超过 16 MB。但另一方面,在存储数据时,它不知道将对这些数据运行什么查询。因此,最终您将插入如此大的文档,以后无法使用。 (因为在插入时我们不告诉查询模式,我们甚至可以稍后尝试一次获取完整的文档)。

    如果限制是传输(假设),那么软件开发人员可以通过多种方式(通过代码)将数据以集群的形式存储到 RAM 中,并且他们永远不会超过 16 MB 的限制(这就是他们执行 IO 操作的方式。在大文件上)。他们会取笑这个限制,让它毫无用处。我希望 MongoDB 的创建者知道并且不希望它发生。

    此外,如果传输受到限制,则无需单独收集。我们可以将所有内容放在一个集合中,只需编写智能查询即可获取数据。如果获取的数据超过 16 MB,则部分获取它并忘记限制。但事实并非如此。

    所以限制必须是文档大小,否则会产生很多问题。

    在我看来,如果您只需要“doctorsWorking”数据进行过滤或查询(并且如果您还认为“doctorsWorking”会导致文档超过 16 MB 的限制),那么最好将其保存在单独的集合中。

    最终,所有事情都取决于查询和数据模式。如果一名医生可以在多家医院轮班服务,那么最好将医生分开收集。

    【讨论】:

    • 感谢您抽出宝贵时间回答。我不会加载整个文档,而只会加载其中的一部分,同时更新db.Clinic.update({"_id" : ObjectId("58e5e3ec54ccefdd4d85f638")}, { $set: { "doctorsWorking.doctor5": { "doctorJoined": ISODate("2017-05-15T10:47:47.647Z") } }} 使用此方法只会更新提供的特定字段。我想知道的是,即使使用此方法,它是否会将完整的文档加载到内存中,还是仅将其中的一部分更新? docs.mongodb.com/manual/reference/operator/update/set
    • @RobinsGupta MongoDB 会知道整个文档太大,并停止更新。
    • @RobinsGupta 它不允许任何超过 16 MB 的文档。通过任何更新或插入或 upsert。
    猜你喜欢
    • 2021-05-06
    • 2020-09-15
    • 2018-03-09
    • 1970-01-01
    • 2020-10-04
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多