【问题标题】:Mongodb updating nested array of objectsMongodb更新嵌套的对象数组
【发布时间】:2021-03-25 22:23:35
【问题描述】:

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

{
  partId: 871838,
  partNum: '87087',
  partName: 'Brick Special 1 x 1 with Stud on 1 Side',
  colorId: 0,
  colorName: 'Black',
  quantity: 10,
  partImg: 'https:...'
}

我想将部件添加到数组中,但前提是用户尚未拥有它。我尝试使用 $addToSet,如下所示:

await User.updateOne(
    { username: username },
    { $addToSet: { parts: { $each: req.body.parts } } }
  );

但这行不通,因为有时零件是相同的,但数量会有所不同,这足以将其视为不同的零件,因此会被添加。有没有办法指定通过哪个值来确定对象是否已经存在于数组中?

编辑:所以,我在文档中找到了这个:

您不能指定 MongoDB 只比较 文件以确定该文件是否是 现有数组元素

所以这意味着 $addToSet 不适合我的情况......现在我不知道该怎么做。

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我发布了一个答案,因为我设法得到了我想要的结果,我想要一些反馈。它工作正常,但感觉蛮力和有点hacky:

      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 运算符或聚合的方法,我很乐意看到。

    【讨论】:

      【解决方案2】:

      如果我理解正确,如果部件存在,您想更改特定字段。收到支票后,您可以参考以下内容:

      await User.updateOne(
          { username: username },
          { $set:  { "parts.0.partNum": 234234 }
        );
      

      假设您知道特定部分的索引。您可以参考:https://docs.mongodb.com/manual/reference/operator/update/set/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 2015-01-31
        • 1970-01-01
        • 1970-01-01
        • 2023-01-12
        相关资源
        最近更新 更多