【问题标题】:MongoDB conditional update array elementsMongoDB 条件更新数组元素
【发布时间】:2021-09-29 23:40:02
【问题描述】:

我在 Node.js 后端使用 Mongoose,我需要根据条件更新文档中数组元素的子集。我曾经使用 save() 执行操作,如下所示:

const channel = await Channel.findById(id);
  channel.messages.forEach((i) =>
    i._id.toString() === messageId && i.views < channel.counter
      ? i.views++
      : null
  );
  await channel.save();

我想通过使用 findByIdAndUpdate 更改此代码,因为它只是一个增量,对于我的用例,不需要检索文档。关于如何执行该操作的任何建议?

当然,channel.messages 是正在讨论的数组。 views 和 counter 都是 Number 类型。

编辑 - 示例文档:

{
    "_id": {
            "$oid": "61546b9c86a9fc19ac643924"
    },
    "counter": 0,
    "name": "#TEST",
    "messages": [{
        "views": 0,
        "_id": {
            "$oid": "61546bc386a9fc19ac64392e"
        },
        "body": "test",
        "sentDate": {
            "$date": "2021-09-29T13:36:03.092Z"
        }
    }, {
        "views": 0,
        "_id": {
            "$oid": "61546dc086a9fc19ac643934"
        },
        "body": "test",
        "sentDate": {
            "$date": "2021-09-29T13:44:32.382Z"
        }
    }],
    "date": {
        "$date": "2021-09-29T13:35:33.011Z"
    },
    "__v": 2
}

【问题讨论】:

  • 你能添加一个示例文档吗?
  • @J.F.是的,当然

标签: javascript node.js arrays mongodb mongoose


【解决方案1】:

如果您不想在结果中检索文档,可以尝试updateOne 方法,

  • 匹配两个字段id 和messageId 条件
  • 检查表达式条件,$filter迭代messages数组的循环并检查messageId和views是否小于counter然后它会返回结果和$ne条件将检查结果不应该空的
  • 如果使用 $ 位置运算符匹配查询,$inc 将 views 递增 1
messageId = mongoose.Types.ObjectId(messageId);
await Channel.updateOne(
  {
    _id: id,
    "messages._id": messageId,
    $expr: {
      $ne: [
        {
          $filter: {
            input: "$messages",
            cond: {
              $and: [
                { $eq: ["$$this._id", messageId] },
                { $lt: ["$$this.views", "$counter"] }
              ]
            }
          }
        },
        []
      ]
    }
  },
  { $inc: { "messages.$.views": 1 } }
)

Playground

【讨论】:

    猜你喜欢
    • 2015-03-29
    • 2013-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 2011-12-19
    • 2020-01-26
    • 2020-04-18
    相关资源
    最近更新 更多