Mongoose子文档与嵌套模式

我很好奇在我的主要模式中使用子文档与更深层次的优点和缺点:

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

要么

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

我目前在各地使用subdocs,但我主要想知道性能或查询我可能遇到的问题。

根据文件 ,这是完全一样的。 但是,使用Schema也会添加_id字段(只要您没有禁用),并且可能会使用一些更多的资源来跟踪subdoc。

替代的声明语法

v3中的新function如果您不需要访问子文档模式实例,则还可以通过传递一个对象字面量来声明子文档[…]

如果您的模式在模型的各个部分都有重复使用,那么为子文档定义单独的模式可能很有用,因此您不必重复自己。

我认为这是由SO多个职位处理。

一些:

  • MongoDB的关系:embedded或引用?
  • 我应该如何在MongoDB中实现这个模式?
  • MongoDB架构devise – 许多小文件或更less的大文件?

最关键的是,这里没有单一的答案,只有一套相当复杂的折衷。

如果是静态文档,或者由于性能影响而不超过几百个,则应该使用embedded式文档。 我刚刚经历了这个问题。 最近,作为MongoDB解决scheme架构师的Asya Kamsky写了一篇关于“使用子文档”的文章。

我希望这有助于谁在寻找解决scheme或最佳实践。

http://askasya.com/post/largeembeddedarrays上的原文。; 你可以在https://stackoverflow.com/users/431012/asya-kamsky上find她的stackoverflowconfiguration文件;

首先,我们必须考虑为什么我们想要做这样的事情。 通常情况下,我build议人们在获取这个文档时embedded他们总想回来的东西。 另一方面,你不希望在文档中embedded你不想回头的东西。

如果你在文档中embedded了一些活动,它会很好地工作,因为我所有的活动都在那里,只需要一次阅读,你就可以找回所有你想告诉我的东西:“你最近点击了这里,在这里是你最后的两个意见“,但是六个月后会发生什么,我不在乎我很久以前做的事情,除非我专门去寻找一些旧的活动,否则你不想把它们展示给我。

首先,你将最终返回越来越大的文件,并关心越来越小的部分。 但是您可以使用投影来仅返回一些数组,但真正的痛苦是,即使您只将部分数据返回给最终用户,磁盘上的文档也会变大并且仍会全部读取,但是因为只要我活跃,我的活动就不会停止,文件将会继续增长和增长。

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

还有一件事你可以做,这将完全杀死你的应用程序的性能,这是索引这个不断增加的数组。 这意味着每次重新定位该数组的文档时,需要更新的索引条目的数量与该文档中的索引值的数量成正比,并且数组越大,数字越大是。

当他们非常适合数据模型时,我不希望这样做会使用数组 – 它们是文档数据库数据模型的一个强大function,但是像所有强大的工具一样,它需要在正确的环境中使用它应该小心使用。

基本上,创build一个variablesnestedDov并把它放在这里name: [nestedDov]

简单版本:

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

JSON示例

 { "_id" : ObjectId("57c88bf5818e70007dc72e85"), "name" : "Corinthia Hotel Budapest", "stars" : 5, "description" : "The 5-star Corinthia Hotel Budapest on the Grand Boulevard offers free access to its Royal Spa", "photos" : [ "/photos/hotel/corinthiahotelbudapest/1.jpg", "/photos/hotel/corinthiahotelbudapest/2.jpg" ], "currency" : "HUF", "rooms" : [ { "type" : "Superior Double or Twin Room", "number" : 20, "description" : "These are some great rooms", "photos" : [ "/photos/room/corinthiahotelbudapest/2.jpg", "/photos/room/corinthiahotelbudapest/5.jpg" ], "price" : 73000 }, { "type" : "Deluxe Double Room", "number" : 50, "description" : "These are amazing rooms", "photos" : [ "/photos/room/corinthiahotelbudapest/4.jpg", "/photos/room/corinthiahotelbudapest/6.jpg" ], "price" : 92000 }, { "type" : "Executive Double Room", "number" : 25, "description" : "These are amazing rooms", "photos" : [ "/photos/room/corinthiahotelbudapest/4.jpg", "/photos/room/corinthiahotelbudapest/6.jpg" ], "price" : 112000 } ], "reviews" : [ { "name" : "Tamas", "id" : "/user/tamas.json", "review" : "Great hotel", "rating" : 4 } ], "services" : [ "Room service", "Airport shuttle (surcharge)", "24-hour front desk", "Currency exchange", "Tour desk" ] } 

例:

在这里输入图像说明