簡體   English   中英

使用 Mongoose ArrayFilters 更新嵌套子文檔時出錯

[英]Error when using Mongoose ArrayFilters to update nested subdocument

我有一個 Mongoose 集合,我想更新它的嵌套子文檔。

基本設置是這樣的:

  • 父條目(地圖)
  • 其中包含一系列孩子(階段)
  • 每個子級由一個或多個孫子級(步驟)組成。

我希望能夠找到一個孫子並更新它。 我的方法是找到包含孫子的父級(Map),然后更新它。

這些是我的簡化模式:

const phaseSchema = new mongoose.Schema(
  {
    name: String,
    color: String,
    steps: [
      new mongoose.Schema(
        {
          name: String,
          body: String,
          entry: {
            type: mongoose.SchemaTypes.ObjectId,
            ref: 'entry',
            default: null
          }
        },
        { timestamps: false }
      )
    ]
  },
  { timestamps: false, _id: true }
)

const mapSchema = new mongoose.Schema(
  {
    name: String,
    phases: [phaseSchema]
  },
  { timestamps: false }
)

export const Map = mongoose.model('map', mapSchema)

我正在嘗試使用 ArrayFilters 來查找和更新子文檔,但沒有運氣:

req.body = {
    map_id: 'some_mongoose_id',
    step_id: 'some_other_mongoose_id'
}
const newEntryId = 'a_new_mongoose_id'

// Find the parent (Map) and update it
const UpdatedMap = await Map.update(
    { _id: req.body.map_id }, 
    {
        $set: {
          'phases.$[i].steps.$[j].entry': mongoose.Types.ObjectId(newEntryId)
        }
    },
    {
        arrayFilters: [
            {
                'i.steps._id': mongoose.Types.ObjectId(req.body.step_id)
            },
            {
                'j._id:': mongoose.Types.ObjectId(req.body.step_id)
            }
        ]
    }
)

這會引發以下錯誤:

錯誤:在架構中找不到路徑“phases.0.steps.0._id:”

巧合的是,我嘗試更新的階段和步驟都在索引 0 處。

如果我換出 arrayFilters 並對索引進行硬編碼,例如$set: {'phases.0.steps.0.entry': mongoose.Types.ObjectId(newEntryId)'} ,它就可以工作。

我究竟做錯了什么?

i是導致錯誤的原因,它也是多余的。 沒有它,嵌套的 arrayFilter 將按需要工作。

const UpdatedMap = await Map.update(
    { _id: req.body.map_id }, 
    {
        $set: {
          'phases.steps.$[j].entry': mongoose.Types.ObjectId(newEntryId)
        }
    },
    {
        arrayFilters: [
            {
                'j._id:': mongoose.Types.ObjectId(req.body.step_id)
            }
        ]
    }
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM