Mongodb 为Monger实现类似Mongoose的填充:性能考虑
我正在用Clojure在MongoDB数据库上编程一个web后端,Monger作为驱动程序 我非常喜欢Monger,但我错过了Mongoose驱动程序中非常有用的一个功能:populate方法,它使我能够在查询中模拟基本连接 事情是这样的:Mongodb 为Monger实现类似Mongoose的填充:性能考虑,mongodb,clojure,mongoose,query-performance,monger,Mongodb,Clojure,Mongoose,Query Performance,Monger,我正在用Clojure在MongoDB数据库上编程一个web后端,Monger作为驱动程序 我非常喜欢Monger,但我错过了Mongoose驱动程序中非常有用的一个功能:populate方法,它使我能够在查询中模拟基本连接 事情是这样的: MyModel.find() .populate("myExternalKey")// put the name of the key to populate; Mongoose knows in which collection to look
MyModel.find()
.populate("myExternalKey")// put the name of the key to populate; Mongoose knows in which collection to look, because you have registered this property as a Ref
.exec();
所以第一个问题:对于Monger或Clojure有类似的东西吗
我没有找到任何答案,所以假设答案是否定的,下面是我的计划
我正在考虑使用以下用法创建一个名为my populate的Clojure实用程序函数:
(my-populate mydoc
{:key1 "aCollectionName"
:key2 {:key3 "anotherCollectionName"
:key4 "yetAnotherCollName"}})
其中mydoc是一个映射,表示MongoDB文档,外部引用路径为:key1、:key2:key3和:key2:key4的其他集合,调用my populate会很好地返回填充的文档,更可能是一个包含该文档的core.async通道,以说明真相
我这样做的策略只是对每个字段进行一次查询,这并不难,但现在我关心的是性能方面的考虑
我是否应该担心此策略的性能问题?是否有一些MongoDB高级功能可以帮助解决这个问题
也许有人知道Mongoose的populate在幕后做了什么,可以给我一些见解。看看性能影响,因为它们在任何语言中都是一样的。Mongo一次只能读取一个集合。所有填充操作都是从一个集合中读取,收集引用ID的列表,并针对这些文档的另一个集合进行查询。然后,为了方便起见,数据被加入内存。您必须记住的是,每个填充都是一个单独的查询。如果单个对象需要4个查询,则性能将开始下降。。。在这一点上使用关系数据库。这才是它真正擅长的。