Mongoose子文档与嵌套模式

10 浏览
0 Comments

Mongoose子文档与嵌套模式

我对使用子文档与在主架构中使用更深层级的优缺点很好奇:\n

var subDoc = new Schema({
  name: String
});
var mainDoc = new Schema({
  names: [subDoc]
});

\n或者\n

var mainDoc = new Schema({
  names: [{
    name: String
 }]
});

\n我目前在所有地方都使用子文档,但我想了解主要是关于性能或查询问题可能会遇到的情况。

0
0 Comments

Mongoose subdocuments vs nested schema的问题是为什么会出现这个问题以及如何解决这个问题。

首先,我们需要考虑为什么要这样做。通常情况下,我会建议人们将他们总是想要在获取此文档时返回的内容嵌入其中。而另一方面,您不希望在文档中嵌入不想与其一起返回的内容。

如果将我的所有活动都嵌入到文档中,一开始会很好,因为我的所有活动都在那里,只需读取一次即可获取我可能想要显示的所有内容:“您最近点击了这个,这是您最近的两条评论”,但是如果过了六个月,我不再关心我很久以前做的事情,除非我特别去查找一些旧活动,否则您不希望向我展示它们。

首先,您将返回越来越大的文档,并且只关心越来越小的部分。但是您可以使用投影来仅返回数组的一部分,真正的痛点是磁盘上的文档将变得越来越大,并且即使您只返回其中的一部分给最终用户,它仍将全部读取,但是由于只要我活动,文档就会继续增长。

这样做最明显的问题是最终会达到16MB文档限制,但这不是您应该担心的。不断增长的文档每次需要重定位到磁盘上时会产生越来越高的成本,即使您采取措施来减轻碎片化的影响,您的写入也将变得不必要地长,从而影响整个应用程序的性能。

还有一件事情可能会完全破坏应用程序的性能,那就是对这个不断增长的数组建立索引。这意味着每次具有该数组的文档被重定位时,需要更新的索引条目数量与文档中索引值的数量成正比,数组越大,该数量就越大。

我不希望这让您对在适合数据模型的情况下使用数组感到恐慌-它们是文档数据库数据模型的强大功能,但与所有强大的工具一样,它需要在正确的情况下使用,并且应谨慎使用。

解决这个问题的方法是使用子文档而不是嵌套模式。子文档是嵌套在父文档中的文档,它们可以被视为父文档的一部分,但又可以作为独立的实体进行查询和操作。这样可以避免文档过大、性能下降和索引更新的问题。

总之,使用子文档而不是嵌套模式是为了避免文档过大、性能下降和索引更新的问题。子文档可以作为独立的实体进行查询和操作,解决了嵌套模式的缺点。

0
0 Comments

Mongoose子文档和嵌套模式之间的比较是一个常见的问题,出现的原因是当我们需要在模型的不同部分重复使用模式时,定义独立的子文档模式会很有用。有时候我们在多个模型中使用子文档,或者在一个模型中有两个需要区分但具有相同子文档结构的字段,这时使用子文档可以解决这个问题。

然而,我们也需要考虑保存冗余信息的好处和缺点。使用子文档会导致冗余信息的保存,因为子文档的结构会在每个使用它的模型中重复。这可能会增加数据库的存储空间和查询的复杂性。

另一方面,使用对象结构也可以实现相同的功能。对象结构是指在模型中直接使用对象来存储子文档的数据,而不是定义独立的子文档模式。这种方法可以减少冗余信息的保存,因为子文档结构只需要定义一次。

解决这个问题的方法是根据实际需求来选择使用子文档还是对象结构。如果我们需要在多个模型中重复使用相同的子文档结构,或者需要区分具有相同子文档结构的字段,那么使用子文档可能是更好的选择。但是,如果我们不需要重复使用子文档结构,或者不需要区分具有相同子文档结构的字段,那么使用对象结构可能更加简单和高效。

总之,Mongoose子文档和嵌套模式之间的选择取决于我们对数据模型的需求和优化的考虑。根据具体情况选择使用子文档还是对象结构可以帮助我们更好地组织和管理数据。

0
0 Comments

问题的原因是使用Mongoose时,子文档默认是嵌入在父文档中,而不是存储在单独的集合中。这可能导致资源的浪费和数据管理的困难。

为了解决这个问题,可以使用嵌套的模式(nested schema)来将子文档存储在单独的集合中。嵌套模式会为子文档添加一个"_id"字段,并使用更多的资源来跟踪子文档。

在Mongoose中,可以使用两种方式声明子文档。一种是使用Schema对象来声明,另一种是直接使用对象字面量来声明。使用Schema对象来声明子文档会自动添加"_id"字段,而直接使用对象字面量来声明子文档则不会添加"_id"字段。

然而,无论使用哪种方式声明子文档,子文档的数据都会默认嵌套在父文档中。如果希望将子文档存储在单独的集合中,需要使用嵌套模式。

对于使用对象字面量声明的子文档数组,Mongoose会自动为其创建一个子模式,并为每个子文档添加"_id"字段。这个行为似乎是Mongoose的默认行为,并且在较长的时间内没有改变。

总之,为了解决Mongoose子文档默认嵌套在父文档中的问题,可以使用嵌套模式来将子文档存储在单独的集合中。

0