【问题标题】:Mongoose $in operator only updating one documentMongoose $in 运算符仅更新一个文档
【发布时间】:2020-06-11 16:54:45
【问题描述】:

我在使用 Mongoose 中的“$in”运算符时遇到问题。在高层次上,我有一个用户模式,其中一个字段是卡片模式的数组。在 Card 模式中有一个“score”字段。我想根据卡片 ID 列表更新“分数”字段。这是我正在尝试使用的:

User.updateMany(
  {
    "_id": userId,
    "cards._id": {
      "$in": cardIds
    }
  },
  { $inc: {"cards.$.score": 1 }},
  (err) => {console.log(err)}
)

当我运行此代码时,仅更新 cardIds 数组中的第一张卡片,而不是全部更新。知道为什么这不起作用吗?谢谢。

【问题讨论】:

  • 你试过cards.score吗?
  • 是的,我试过了,它会抛出一个错误。如果没有 $,它似乎正在尝试创建一个名为“score”的新字段。

标签: javascript node.js mongodb mongoose


【解决方案1】:

您需要在.updateMany() 中使用arrayFilters,试试这个查询:

User.updateMany({
    "_id": userId
},
    { $inc: { "cards.$[element].score": 1 } },
    { arrayFilters: [{ "element._id": { "$in": cardIds } }] },
    (err) => {}
)

【讨论】:

  • 试过这个,但我没有看到我的数据库有任何变化。不过没有错误...
  • @Evan :更新早了吗?您是否检查了输入和数据库匹配中发送的类型?
  • 原始版本是更新数组中的第一张卡片。所以这让我相信我的 id 数组是正确的类型。它是一个字符串数组,如果有帮助的话。
  • 特别是,对于我的测试,我使用了 4 个 ID:[ '5e45a85418385d873b412115', '5e45a86c18385d873b412119', '5e569fff9cb91a0017bc2dbe', '5e456f6fc]8'1984
  • 添加了 err 的回调作为最后一个输入并且它起作用了。谢谢!
猜你喜欢
  • 2019-05-01
  • 1970-01-01
  • 2011-12-07
  • 2015-02-19
  • 2019-10-05
  • 2012-05-21
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多