首页 > 解决方案 > Mongoose:从一堆文件中更新一个文件

问题描述

我有以下几乎可以工作的代码。它将检查域的状态是否已经设置,如果没有,它将推送一个新状态。如果已经有一个,它将更新它,除非存储了不同域的多个状态,在这种情况下,它将替换其他域的所有其他文档,而不仅仅是特定域的一个条目。

      if (Boolean(checkStat) === true) {
        await userModel.findByIdAndUpdate(
          {
            _id: ctx.userId,
            domain: args.domain,
          },
          {
            ["preferences.domain.status"]: {
              domain: args.domain,
              status: args.status,
            },
          },

        );
        return {
          message:
            "sucessfully updated status of " +
            args.domain +
            " to " +
            args.status,
        };
      } else {
        await userModel.findByIdAndUpdate(
          ctx.userId,
          {
            $push: {
              ["preferences.domain.status"]: {
                domain: args.domain,
                status: args.status,
              },
            },
          },
          {
            upsert: true,
            new: true,
          }
        );
        return {
          message:
            "sucessfully set status of " + args.domain + " to " + args.status,
        };
      }
preferences:
  domain:
    labels:
    status:
      0:
        domain: "x.wtf"
        status: "online"
        _id: "Jz-ttsjEXKBSVxAN91CzD"
      1:
        domain: "a.lol"
        status: "online"
        _id: "Jz-ttsjEXKBSVxAN91CzD"
const userSchema = new mongoose.Schema({
  preferences: {
    domain: {
      status: [
        {
          _id: {
            type: String,
            default: () => nanoid(),
          },
          domain: String,
          status: String,
        },
      ],
      labels: [
        {
          _id: {
            type: String,
            default: () => nanoid(),
          },
          domain: String,
          label: String,
        },
      ],
    },
  },
});

标签: mongodbmongoose

解决方案


您可以使用$运算符,findOneAndUpdate而不是findByIdAndUpdate这样做:

await userModel.findOneAndUpdate(
  {
    _id: ctx.userId,
    "preferences.domain.status.domain": args.domain,
  },
  {
    "preferences.domain.status.$.status": args.status,
  }
);

推荐阅读