【问题标题】:Force $set instead of $set interleaving with $pushAll强制 $set 而不是 $set 与 $pushAll 交错
【发布时间】:2017-07-31 11:58:58
【问题描述】:

我正在调试为什么我的 Schema 的 Array 字段的大小只会增加,尽管明确将它们的长度设置为 0 或 = [];

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

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

【问题讨论】:

  • 您能否提供一些示例代码来说明您如何修改数组属性?
  • @ZachB 我只使用访问array[ index ],赋值array = []array.push()array.pop()。嗯,写这句话的时候想知道array.push()会不会有什么问题? Mongoose.js 能否以某种方式推断如果我使用了 .push(),那么导致的 MongoDB 请求必须是 $pushAll
  • @dnickless 问题主要是关于 Mongoose.js 如何以及为什么选择在通过设置新值更新数据将新值附加到哪个数据库之间修改数据库上的数组已经有。在 Mongoose 文档上找不到任何关于它的信息,所以问。看不到我应该做一个例子的代码。

标签: javascript node.js mongodb mongoose


【解决方案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); 

【讨论】:

  • 感谢您的回答。它是否在 Mongoose 文档中的任何地方指定?或者来源中的某个地方?
  • 你目前使用的是什么版本的猫鼬?
  • 我目前已经安装了mongoose@4.7.6
  • 我已经用一些参考资料更新了答案:)
猜你喜欢
  • 1970-01-01
  • 2018-10-31
  • 2020-10-06
  • 2016-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 2011-04-24
相关资源
最近更新 更多