Mongoose中的子文档和人口之间的差异以及对数据库模式的怀疑

时间:2013-08-11 22:34:19

标签: mongodb mongoose database-schema population

我是MongoDB和MongooseJS的新手。抱歉,我也很擅长创建数据库。

第一个问题

子博士和人口之间有什么区别? 查看docs example,Parent-Children子目录似乎非常类似于Person-Stories人口。

数据库架构问题

场景:用户可以创建一些Canvas。每个Canvas都可以托管多个Shapes。每个Shape可以有两种类型:简单或复杂。简单形状可以是方形或圆形(对象)。复杂形状由框架和材料制成。

            Canvas
               |
             Shape
            /     \       
      Simple       Complex: Frame, Material 
      /     \
Square       Circle

现在,Shape只能分配给1 Canvas,但可以在Canvases之间移动,也可以在Canvas外单独使用。框架和材质可以独立创建(独立生活)并添加到复杂形状(每个复杂形状只能有1个框架和1个材质)。

我必须实现的一些查询是要求特定Canvas中的所有形状,或者使用某种材质的所有形状,或者是形状所使用的所有框架。

由于子博客和人口之间的区别对我来说并不清楚,我甚至不确定如何开始......任何帮助或示例都会受到赞赏(我不期待完整且有效的数据库架构)。 / p>

1 个答案:

答案 0 :(得分:1)

在回答第一部分时,区别在于在Document-Subdocument场景中,子文档与文档一起存储(作为子文档,可通过使用点表示法访问)。

在Mongoose填充场景中,对另一个集合中的文档进行引用。当你告诉mongoose填充它的作用时,再向MongoDB发出一个查询来获取这个'子文档'。

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


编辑,子文档示例

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

{
    _id: acbdbd,
    "property": "value",
    "subdocumentproperty" : {
        "param1": 1,
        "param2": 2
    }
}

此数据仅与主文档一起存储,您的查询将通过主文档完成,例如

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