Mongodb Mongoose中子文档和总体的差异及对数据库模式的质疑

Mongodb Mongoose中子文档和总体的差异及对数据库模式的质疑,mongodb,mongoose,database-schema,population,Mongodb,Mongoose,Database Schema,Population,我是MongoDB和MongooseJS的新手。对不起,我也不擅长创建数据库 第一个问题 子文档和总体之间的区别是什么? 从总体上看,父-子子文档似乎非常类似于个人故事总体 数据库架构问题 场景:用户可以创建多个画布。每个画布可以承载许多形状。每个形状可以有两种类型:简单或复杂。简单形状可以是正方形或圆形(对象)。复杂形状由框架和材料构成 Canvas | Shape / \

我是MongoDB和MongooseJS的新手。对不起,我也不擅长创建数据库

第一个问题

子文档和总体之间的区别是什么? 从总体上看,父-子子文档似乎非常类似于个人故事总体

数据库架构问题

场景:用户可以创建多个画布。每个画布可以承载许多形状。每个形状可以有两种类型:简单或复杂。简单形状可以是正方形或圆形(对象)。复杂形状由框架和材料构成

            Canvas
               |
             Shape
            /     \       
      Simple       Complex: Frame, Material 
      /     \
Square       Circle
现在,一个形状只能分配给一个画布,但可以在画布之间移动,也可以单独生活在画布之外。框架和材质可以独立创建(单独活动)并添加到复杂形状(每个复杂形状只能有一个框架和一个材质)

我必须实现的一些查询要求特定画布中的所有形状,或者使用特定材质的所有形状,或者形状使用的所有帧


由于我不清楚子文档和总体之间的区别,我甚至不知道如何开始。。。任何帮助或示例都将不胜感激(我不希望有完整且有效的数据库模式)。

在回答第一部分时,区别在于在文档子文档场景中,子文档与文档一起存储(作为子文档,可通过使用点符号访问)

在Mongoose填充场景中,引用保存在另一个集合中的文档。当您告诉mongoose填充它所做的事情时,就是对MongoDB进行另一个查询以获取此“子文档”

我看到的主要区别是,使用mongoose populate方法,您不能使用“subdocument”属性查询文档,而可以使用嵌入的子文档模型


编辑,子文档示例

因此,在MongoDB中,您可以将数据存储为嵌套子文档,如下所示:

{
    _id: acbdbd,
    "property": "value",
    "subdocumentproperty" : {
        "param1": 1,
        "param2": 2
    }
}
此数据仅与主控文档一起存储,您的查询将通过主控文档完成,例如

db.collection.find({"subdocumentproperty.param1": 1})

因此子文档不能独立存在。。e、 g.我可以创建子文档而不将其分配给任何文档吗?在示例中:如果ComplexShape有一个框架子文档,我是否可以将框架从形状中分离出来,并将其存储到DB中以供以后使用?您可以这样做,这完全取决于您将如何查询数据以了解文档的结构。问题是:子文档可以用作文档?它似乎没有模型,所以您可以例如查询数据库中某一类型的所有子文档吗?不,子文档只存在于父文档上。它们实际上只是父对象上属性的集合。我会在答案中加上一个我认为你的意思的例子。哦,我明白了。。因此,子文档非常类似于json对象,它是另一个json对象的成员<代码>文档={key1:val,子文档:{key2:val,…}}。当使用填充而不是子文档时,我正在描述将用于连接的objectid。像这样的东西?对于形状、简单和复杂的东西,数据结构是什么样子的?嗯,我想
Simple
并不是必需的。我来自Java背景,因此我将创建一个带有id、位置、大小的
Shape
类。。然后简单的形状(
正方形
圆形
,…)和
复杂形状
都将继承自它。简单的形状将有不同的属性,而复杂的形状将有一个
框架和一个
材质-
——也许在JS中有比使用更好的方法来做类似的事情?