Mongodb:遍历数组并使用ObjectId更新对象字段

2vuwiymt  于 2022-12-12  发布在  Go
关注(0)|答案(2)|浏览(193)

在下面的示例中,我有一家名为Colors Company的公司,它拥有许多商店

{
    _id: ObjectId("78391283"),
    name: "Colors company",
    shops: [
        {shopID: ObjectId("123456a1cb"), income: 0},
        {shopID: ObjectId("2a1cb67890"), income: 0},
        {shopID: ObjectId("2a1cb010111"), income: 0},
        ...
      ],
}

我需要:1-在shops数组上循环,使用{parsedBody.shopID}找到请求的数组2-将“shop.$.income”中存储的金额用作数字2-使用{parsedBody.amountToAdd}增加收入
这是POST请求的parsedBody:

{
    companyID: "78391283",
    shopID: "123456a1cb",
    amountToAdd: 200,
}

我用的是Next js 13。
谢谢你的帮助!
我尝试过的:

const ObjectId = require("mongoose").Types.ObjectId;

Shops.findOneAndUpdate(
    { _id: parsedBody.shopID},
    {
        set: {
        // <-- missing loop here
        "shops.$.income": { parsedBody.amountToAdd + income }
        }
    }
)

我希望遍历商店数组并更新收入字段。

u3r8eeie

u3r8eeie1#

选项1:这似乎是一个简单的选项mongoDB 3.6+

db.collection.update({},
{
 "$inc": {
"shops.$[x].income": 200
}
},
{
 arrayFilters: [
  {
   "x.shopID": 2
  }
 ]
})

Playground1

选项2:使用更新/聚合mongoDB 4.2+

db.collection.update({},
 [
 {
 $addFields: {
  shops: {
    "$map": {
      "input": "$shops",
      "as": "s",
      "in": {
        "$cond": {
          "if": {
            $eq: [
              "$$s.shopID",
              2
            ]
          },
          "then": {
            $mergeObjects: [
              "$$s",
              {
                income: {
                  $sum: [
                    "$$s.income",
                    200
                  ]
                }
              }
            ]
          },
          "else": "$$s"
        }
      }
     }
    }
   }
  }
  ])

Playground2

选项3:另一个简单选项,警告:当shopID在shops数组中不应出现多次时,需要使用此选项,因为它将只更新第一个找到的shop元素,如果同一文档中有多个元素具有相同的shopID,则不会更新这些元素。

db.collection.update({
   "shops.shopID": 2
},
{
 $inc: {
  "shops.$.income": 200
 }
})

Playground3

neskvpey

neskvpey2#

在数据库设计中,应将“公司”文档中的“收入”字段移到“商店”文档中,以便更新不同商店的不同收入。

Shops.findOneAndUpdate(
  { _id: parsedBody.shopID},
  {
    set: {
     "income": { parsedBody.amountToAdd + income }
    }
  }
 )

相关问题