You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mongoose与Node.js从嵌入文档spas移除最新duration=60的对象

解决方法:移除嵌入数组中最新的duration=60的子文档

要实现这个需求,核心是定位到spas数组里最新的duration=60的子文档——MongoDB的ObjectId内置了创建时间戳,所以数组中_id值最大的条目就是最新添加的。下面给你两种适配不同场景的方案:

方案一:分两步查询+更新(兼容所有MongoDB版本)

这种方式逻辑直观,先找到目标子文档的_id,再执行移除操作,适合所有版本的MongoDB:

const SpaServiceModel = require('./your-model-path'); // 引入你的Mongoose模型

async function removeLatest60MinSpa() {
  // 1. 查询目标主文档
  const serviceDoc = await SpaServiceModel.findById("5f071322c89b0e2a7c35a25a");
  if (!serviceDoc) {
    console.log("目标文档不存在");
    return;
  }

  // 2. 筛选出duration=60的子文档,按创建时间倒序排序后取第一个(最新的)
  const targetSpa = serviceDoc.spas
    .filter(spa => spa.duration === 60)
    .sort((a, b) => b._id.getTimestamp() - a._id.getTimestamp())[0];

  if (!targetSpa) {
    console.log("没有找到duration为60的spa条目");
    return;
  }

  // 3. 执行$pull操作移除该子文档
  const updatedDoc = await SpaServiceModel.findByIdAndUpdate(
    "5f071322c89b0e2a7c35a25a",
    { $pull: { spas: { _id: targetSpa._id } } },
    { new: true } // 返回更新后的文档,方便验证
  );

  console.log("更新后的文档:", updatedDoc);
}

removeLatest60MinSpa().catch(err => console.error(err));

方案二:单步管道更新(MongoDB 4.2+推荐)

如果你使用的是MongoDB 4.2及以上版本,可以用聚合管道来完成单步更新,只需要一次数据库请求,效率更高:

const SpaServiceModel = require('./your-model-path');

async function removeLatest60MinSpa() {
  const updatedDoc = await SpaServiceModel.findByIdAndUpdate(
    "5f071322c89b0e2a7c35a25a",
    [
      {
        $set: {
          spas: {
            // 过滤掉目标子文档
            $filter: {
              input: "$spas",
              cond: {
                // 排除_id等于最大duration=60子文档的_id的条目
                $ne: [
                  "$$this._id",
                  {
                    // 先筛选出所有duration=60的子文档,提取它们的_id,再取最大的那个(最新的)
                    $max: {
                      $map: {
                        input: { $filter: { input: "$spas", cond: { $eq: ["$$this.duration", 60] } } },
                        as: "spa",
                        in: "$$spa._id"
                      }
                    }
                  }
                ]
              }
            }
          }
        }
      }
    ],
    { new: true }
  );

  console.log("更新后的文档:", updatedDoc);
}

removeLatest60MinSpa().catch(err => console.error(err));

注意事项

  • 两种方案都处理了“没有找到符合条件的子文档”和“目标主文档不存在”的边界情况,避免无效操作。
  • 管道更新的方式更高效,但需要MongoDB版本支持;分两步的方式兼容性更强,逻辑更易理解。

内容的提问来源于stack exchange,提问作者user10851063

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 12:37:36