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
相关产品推荐
相关产品推荐

