mongodb中的多重更新(MONGOOSE)

fae0ux8s  于 11个月前  发布在  Go
关注(0)|答案(1)|浏览(151)

我总是发现我自己在这样的情况下,当我需要作出一些更新请求的基础上的一些条件。

if (some true condition) {
        let recordBeforeUpdate = await this.PatchModel.findOneAndUpdate({ "_id": patchId }, { $inc: { inStockPallets: -1, fullfilledPallets: 1 } }, { returnDocument: "before" });
        debug(recordBeforeUpdate);
        if (another true condition) { //based on the recordBeforeUpdate 
          let patch = await this.PatchModel.updateOne({ "_id": patchId }, { $set: {isFulfilled: true} });
          debug(patch);
        }
      }

字符串
我在这里寻找最佳实践,我已经使用了两个对数据库的请求,并且我首先使用findOneAndUpdate,以便能够在更新时获得记录,而不是通过第三个findOne请求获得记录。
那么我应该如何在一个请求中向数据库提交这些内容呢?

n6lpvg4x

n6lpvg4x1#

mongoose findOneAndUpdate方法接受聚合管道,因此您可以对聚合阶段内的特定字段运行条件更新。您需要使用$add来递增inStockPalletsfullfilledPallets的值,而不是$inc,但这很简单。正如您所看到的,这两个更改都是在一个数据库操作中完成的。
因为你没有共享你的模式,我假设你有一个名为delivered的字段,它是一个String,当它的值是yes时,你想把isFulfilled设置为true,否则它将是false。显然,你可以修改它以满足你的需要:

const patch = await this.PatchModel.findOneAndUpdate(
    { "_id": patchId },
    [ //< Aggregation stage
        {
            $set: {
                isFulfilled: {
                    $cond: [ //< Set the isFulfilled based on the following condition
                        {
                            $eq: [
                                "$delivered", //< The name of the field you want to check
                                "yes" //< The value that you want to check is true
                            ]
                        },
                        true, //< Set isFulfilled to true if {delivered: "yes"}
                        false //< Set isFulfilled to false if {delivered: "anything other than yes"}
                    ]
                },
                inStockPallets: {
                    $add: [ "$inStockPallets", -1 ]
                },
                fullfilledPallets: {
                    $add: [ "$fullfilledPallets", 1 ]
                }
            }
        }
    ],
    { new: true }
);

字符串

相关问题