Mongodb 为Monger实现类似Mongoose的填充:性能考虑

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

我正在用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, 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个查询,则性能将开始下降。。。在这一点上使用关系数据库。这才是它真正擅长的。