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

MongoDB中如何按食物名称向mealplan早餐项的completed数组添加日期

功能实现需求

需要向用户餐单(mealplan)的早餐(breakfast)列表中按条件匹配指定名称的食物(例如名称为banana的食物项),将请求传入的日期添加到该食物的completed数组中。每个食物项都包含completed数组,每次发送请求时可对该数组执行日期添加或移除操作,当前需要优先实现向completed数组推送日期的功能。

现有Mongoose文档结构
{
    "_id": {
        "$oid": "616f193e9eb4ca14afc47fa8"
        },
    "date": {
        "$date": "2021-10-19T15:52:09.298Z"
    },
    "email": "john@live.com",
    "firstName": "john",
    "lastName": "doe",
    "password": "$2b$10$jKylT8MKsUl7ZS03EVi7SecQ1eWuB37J5rLVTU/C8VXBwkWQQo6EK",
    "role": "user",
    "token": "eyJhbGciOiJIQb-JA2kcKxWquDaM",
    "mealplan": {
        "dietType": ["Halal", "Vegetarian", "Vegan"],
        "religionType": ["Agnostic", "Muslim", "Christian", "Buddhist"],
        "ethinicType": ["Asian", "Native American"],
        "_id": "6179a178ba48312626059d44",
        "name": "first meal",
        "budget": 2000,
        "orac": 163,
        "medicinal": 0,
        "breakfast": [
        {
            "type": "breakfast",
            "completed": [],
            "fdcId": 1103194,
            "name": "Carrots, raw, salad",
            "numbers": 1,
            "unit": "100 grams",
            "recurring": {
            "startTime": "08:30",
            "endTime": "09:30",
            "startDate": "2021-10-28",
            "endDate": "2021-11-03",
            "daysofweek": []
            }
        },
        {
            "type": "breakfast",
            "completed": [],
            "name": "orange juice",
            "numbers": 1,
            "unit": "100 mililiters",
            "recurring": {},
            "orac": 10,
            "medicinal_value": 0,
            "nutrition": []
        },
        {
            "type": "breakfast",
            "name": "banana",
            "completed": [],
            "numbers": 1,
            "unit": "100 grams"
        }
        ]
    },
    "__v": 0
}
接口调用说明

POST请求需要携带以下参数:

  • 用户唯一标识(如用户_id、邮箱)
  • 目标食物名称foodName
  • 要操作的日期completedDate
代码实现

添加日期到completed数组

使用Mongoose的arrayFilters匹配嵌套数组中对应名称的食物项,配合$addToSet实现无重复添加日期:

// 示例基于用户模型为 User 的场景
const { userId, foodName, completedDate } = req.body;

await User.updateOne(
  // 第一步:匹配目标用户
  { _id: userId },
  // 第二步:向匹配到的食物项的completed数组添加日期
  {
    $addToSet: {
      "mealplan.breakfast.$[targetFood].completed": completedDate
    }
  },
  // 第三步:指定数组过滤规则,匹配名称一致的早餐食物
  {
    arrayFilters: [
      { "targetFood.name": foodName }
    ]
  }
)

如果你允许同一日期重复添加,可以把$addToSet替换为$push。

移除completed数组中指定日期

如果后续需要实现移除功能,替换更新操作符为$pull即可:

await User.updateOne(
  { _id: userId },
  {
    $pull: {
      "mealplan.breakfast.$[targetFood].completed": completedDate
    }
  },
  {
    arrayFilters: [
      { "targetFood.name": foodName }
    ]
  }
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:06:03