如果存在,猫鼬添加到嵌套数组的数组中,否则创建

Mongoose add to array of nested array if exists create otherwise

我正尝试在 mongoose 中完成以下任务:

假设我有以下 collection

{
    "_id": {
        "$oid": "111"
    },
    "email": "xxx@mail.com",
    "givenName": "xxx",
    "familyName": "xxx",
    "favoriteProducts": [{
        "soldTo": "33040404",
        "skus": ["W0541", "W2402"]
    }, {
        "soldTo": "1223",
        "skus": ["12334"]
    }]
}

我希望能够根据 soldTo 和 _id 将 sku 添加到最喜欢的产品数组。 这样做时有两种可能的情况。

一个。在 favoriteProducts 中已经有一个具有给定 soldTo 的 object,在这种情况下,sku 只是添加到数组中。(例如,将 sku '12300' 添加到 soldTo '1223' 以获取 id '111')

b。给定的 soldTo 还没有 object,在这种情况下,需要使用给定的 sku 和 soldTo 创建这个 object。 (例如,将 sku '123' 添加到 soldTo '321' 以获取 id '111')

到目前为止我已经这样做了,但我觉得有一种方法可以在一个查询中完成。

 private async test() {
    const soldTo = '1223';
    const sku = '12300';
    const id = '111';
    const hasFavoriteForSoldTo = await userModel.exists({
      _id: id,
      'favoriteProducts.soldTo': soldTo,
    });

    if (!hasFavoriteForSoldTo) {
      await userModel
        .updateOne(
          {
            _id: id,
          },
          { $addToSet: { favoriteProducts: { skus: [sku], soldTo } } },
        )
        .exec();
    } else {
      await userModel
        .updateOne(
          {
            _id: id,
            'favoriteProducts.soldTo': soldTo,
          },
          { $addToSet: { 'favoriteProducts.$.skus': sku } }
        )
        .exec();
    }
  }

使用update-documents-with-aggregation-pipeline

查看下面的 mongo 游乐场。不确定您想要 输出 1 还是 输出 2.

输出 1

db.collection.update({
  _id: { "$oid": "111222333444555666777888" }
},
[
  {
    $set: {
      favoriteProducts: {
        $cond: {
          if: { $in: [ "1223", "$favoriteProducts.soldTo" ] },
          then: {
            $map: {
              input: "$favoriteProducts",
              as: "f",
              in: {
                $cond: {
                  if: { $eq: [ "1223", "$$f.soldTo" ] },
                  then: { $mergeObjects: [ "$$f", { skus: [ "12300" ] } ] },
                  else: "$$f"
                }
              }
            }
          },
          else: {
            $concatArrays: [ "$favoriteProducts", [ { skus: [ "12300" ], soldTo: "1223" } ] ]
          }
        }
      }
    }
  }
],
{
  multi: true
})

mongoplayground


输出 2

db.collection.update({
  _id: { "$oid": "111222333444555666777888" }
},
[
  {
    $set: {
      favoriteProducts: {
        $cond: {
          if: { $in: [ "1223", "$favoriteProducts.soldTo" ] },
          then: {
            $map: {
              input: "$favoriteProducts",
              as: "f",
              in: {
                $cond: {
                  if: { $eq: [ "1223", "$$f.soldTo" ] },
                  then: {
                    $mergeObjects: [
                      "$$f",
                      { skus: { $concatArrays: [ [ "12300" ], "$$f.skus" ] } }
                    ]
                  },
                  else: "$$f"
                }
              }
            }
          },
          else: {
            $concatArrays: [ "$favoriteProducts", [ { skus: [ "12300" ], soldTo: "1223" } ] ]
          }
        }
      }
    }
  }
],
{
  multi: true
})

mongoplayground