挣扎于猫鼬查询,将不同的对象推送到单个深层嵌套对象中的不同数组中

Struggle with mongoose query, pushing different Objects into different arrays in a single deeply nested object

我只是想不通查询,即使它允许编写单个查询以将 4 个不同的对象推送到深深嵌套在用户对象中的 4 个不同的数组中。

我从前端收到 PATCH 请求,其正文如下所示:

{
  bodyweight: 80,
  waist: 60,
  biceps: 20,
  benchpress: 50,
  timestamp: 1645996168125
}

我想创建 4 个对象并将它们推送到 Mongo Atlas

中的用户数据中

{date:1645996168125, value:80}user.stats.bodyweight <-array

{date:1645996168125, value:60}user.stats.waist <-array

...等等

我正在尝试找出第二个参数:

let user = await User.findOneAndUpdate({id:req.params.id}, ???)

但如果可能的话,我很乐意用任何其他猫鼬方法更新它。

PS:我不是故意使用 mongoDB 给出的 _id

试试这个:

await User.findOneAndUpdate(
     {id:req.params.id},
     {$addToSet:
          {"stats.bodyweight":{date:1645996168125, value:80} } 
     }
                           )

您需要使用 $push 运算符。它接受路径作为字段名称,因此您可以指定每个数组的路径。

我假设您的请求中包含的字段是固定的(每个请求都有相同的四个 属性 名称/数组)

let user = await User.findOneAndUpdate(
  { id: req.params.id },
  {
    $push: {
      "stats.bodyweight": {
        date: 1645996168125,
        value: 80,
      },
      "stats.waist": {
        date: 1645996168125,
        value: 60,
      },
      // ...
    },
  }
);

如果字段是动态的,使用对象和 if 条件,如下所示:

const update = {};
if ("bodyweight" in req.body) {
  update["stats.bodyweight"] = {
    date: 1645996168125,
    value: 80,
  };
}
// ...

let user = await User.findOneAndUpdate(
  { id: req.params.id },
  {
    $push: update,
  }
);

if 条件只是为了演示原理,您可能希望使用更严格的类型检查/验证。