使用$ pushAll强制$ set而不是$ set interleaving

时间:2017-07-31 11:58:59

标签: javascript node.js mongodb mongoose

我正在调试为什么我的架构的数组字段只是在增加大小,尽管明确地将它们的长度设置为0或 = [];

事实证明,当Mongoose向MongoDB发送请求时,某些部分请求的后缀为 $ set ,而其他部分请求 $ pushAll ,尽管有一些 $ set ting值也是数组。

Mongoose如何选择要指定的后缀?如何强制它对所有更新字段使用 $ set

1 个答案:

答案 0 :(得分:1)

根据您的猫鼬版本,array.push()依赖$pushAll ,所以......

  

如何强制它对所有更新字段使用 $ set

array.push(whatever); //uses $pushAll

改为使用:

array = array.concat([whatever]); //uses $set

修改

您应该在撰写本文时更新到最新版本(4.11.5

您可以看到@ mongoose/array.js

  • 值必须始终传递给构造函数进行初始化,否则MongooseArray#push会将数组标记为已修改。

MongooseArray Constructor中,您可以看到使用concat完成以避免#push标记:

function MongooseArray(values, path, doc) {
 var arr = [].concat(values);