Looks like there is a fourth, undocumented parameter in the update function $literal. Setting this to true will make it work as expected. When this is false, which is the default, it'll take your data array and use the $set operator on it. I guess it is trying to simplify things for the user by hiding the $set operation for you and make it work more like the update in the DB class, but it seems backwards to me.