我想观察一个或两个的变化,但绝对不是文档的所有属性。
我想知道如果在已投射的光标上调用observeChanges
函数是否会更高效?
没有投影
MyCollection.find().observeChanges(
changed: (_id, fields) ->
if fields.myProperty?
doMyFunctionality(fields.myProperty)
)
使用投影
MyCollection.find({}, myProperty: 1).observeChanges(
changed: (_id, fields) ->
doMyFunctionality(fields.myProperty)
)
(假设MyCollection
中的文档至少有另一个属性在某个时候被更改。)
答案 0 :(得分:1)
一般来说,无论您是否直接使用observeChanges
,如果您在发布功能中限制find
请求的字段,那么您的应用会更高效:
如果您使用oplog tailing,我不确定是否有任何显着的计算节省来限制字段。我的直觉是它必须有所帮助,因为驱动程序可能会跳过对非观察区域的任何更改 - 我只是不知道这种影响有多大。
使用旧的poll-and-diff算法时,使用字段投影减少CPU是绝对正确的,因为它实际上区分了文档。要比较的字段越少,执行的效率就越高。
有关其他详细信息,我建议您观看David Glasser的Making Mongo Realtime。