当前位置: 首页 > 知识库问答 >
问题:

Mongodb更新嵌套对象数组

殳凯捷
2023-03-14

我需要更新嵌套在我的用户文档中的一个字段,该字段包含一个part对象数组,以添加新的part。一个part对象如下所示:

{
  partId: 871838,
  partNum: '87087',
  partName: 'Brick Special 1 x 1 with Stud on 1 Side',
  colorId: 0,
  colorName: 'Black',
  quantity: 10,
  partImg: 'https:...'
}
await User.updateOne(
    { username: username },
    { $addToSet: { parts: { $each: req.body.parts } } }
  );

所以这意味着$addToset对我的情况没有好处...现在我不知道该怎么办。

共有1个答案

庄新翰
2023-03-14

我张贴了一个答案,因为我设法得到了我想要的结果,我想要一些反馈。它工作得很好,但感觉蛮力和有点讨厌:

  const incomingParts = req.body.parts;
  const _ownedParts = await User.findOne(
    { username: username },
    { parts: 1, _id: 0 }
  );

  let ownedParts: IPart[] = [];
  const newParts: IPart[] = [];

  //if statement for TS
  if (_ownedParts) {
    ownedParts = _ownedParts.parts;
  }

  let partsToAdd;
  if (ownedParts.length === 0) {
    //if the user owns no parts, just add the whole lot
    partsToAdd = [...req.body.parts];
  } else {
    incomingParts.forEach((incoming: IPart) => {
      const ownedIdx = ownedParts.findIndex((owned: IPart) => {
        return incoming.partId === owned.partId;
      });

      if (ownedIdx !== -1) {
        ownedParts[ownedIdx].quantity += incoming.quantity;
      } else {
        newParts.push(incoming);
      }
    });
    partsToAdd = [...ownedParts, ...newParts];
  }

  await User.updateOne(
    { username: username },
    { $set: { parts: partsToAdd }, $push: { sets: setNum } }
  );

如果有一种使用mongodb运算符或聚合的方法,我很乐意看到。

 类似资料:
  • 我正在尝试更新嵌套数组中的值,但无法使其工作。 我的对象是这样的 提前谢谢!

  • 我正在使用平均堆栈在网格中显示以下数组。 嵌套数组:

  • 问题内容: 我正在尝试更新嵌套数组中的值,但无法使其正常工作。 我的对象是这样的 我需要将值推送到“ answeredBy”数组。 在下面的示例中,我尝试将“成功”字符串推到“ 123 _id”对象的“ answeredBy”数组中,但是它不起作用。 我找到了此链接,但其答案仅表示我应该使用类似结构的对象而不是数组。这不适用于我的情况。我真的需要将我的对象嵌套在数组中 如果您能在这里帮助我,那就太

  • 我有以下JSON: 我希望能够将内容推送到与迭代 2 关联的任务数组中。如何正确查询并插入到正确的位置?这就是我到目前为止所拥有的,但它总是插入到与迭代 1 关联的任务数组中。 我已经看到了这个:MongoDB嵌套数组查询,但他只是试图推送到一个嵌套数组。

  • 我正在尝试更新MongoDB中嵌套对象中的一个键值。目前,我的做法是覆盖整个嵌套对象,我如何改变一个键-值对?

  • mongodb新手,尝试更新文档的多个数组对象字段。没有得到预期的结果 文档结构: 基于id需要更新日期 Spring启动代码 但是当我运行这个查询时,它返回null。有人能帮我吗?谢谢,我也试过了