mongoose MongoDB:通过$push向数组添加元素时,获取文档的当前值

xwmevbvl  于 2023-01-17  发布在  Go
关注(0)|答案(1)|浏览(120)

我有一个集合MyCollection,它基本上由_id和一个名为comment的字符串组成。
是这样做的:

for (const obj of inputObjects) {
      bulkObjectsToWrite.push({
        updateOne: {
          filter: { _id: obj._id },
          update: {
            $set: {
              comment: obj.comment
            }
          }
        }
      })
    }
    await MyCollection.bulkWrite(bulkObjectsToWrite)

到目前为止一切顺利。
但是,现在的要求是,应添加commentHistory,其外观应类似于[{"oldValue": "oldValueOfComment", "newValue": "newValueOfComment"}, ...]
我知道我需要使用$push来向commentHistory数组添加新对象,但是我如何访问当前更新的文档的comment,即它的当前值?
我试过了

$push: {
              commentHistory: {
                newValue: obj.comment,
                oldValue: '$comment',
              },
},

字符串$comment被硬编码地添加,而不是被访问的字段。
(使用 Mongoose 5.12.10和Mongo 4.4.18)

7z5jn7bk

7z5jn7bk1#

您需要使用update with aggregate pipeline

db.collection.update({
  "key": 1
},
[
  {
    $set: {
      "comment": "New",
      "commentHistory": {
        "$concatArrays": [    //concatenate existing history array with new array entry
          "$commentHistory",
          [
            {
              "newValue": "New",
              "oldValue": "$comment"  //referencing the existing value
            }
          ]
        ]
      }
    }
  }
])

Demo

相关问题