【问题标题】:Update an object inside nested array using mongoose使用 mongoose 更新嵌套数组中的对象
【发布时间】:2021-11-04 09:39:07
【问题描述】:

我的 mongo 架构看起来像这样, 我想更新一个flashcard 对象,它位于一个抽认卡数组中,也位于主题数组中。

const classrooms = new mongoose.Schema({
    name: String,
    year: String,
    student: [
        {
            firstname: String,
            lastname: String,
            mail: String,
            userId: String,
        }
    ],
    subject: [
        {
            subjectId: String,
            flashcard: [
                {
                    title: String,
                    tag: []
                }
            ]
        }
    ]
});

我正在做的是

const flashcard = await classroomModel.findOneAndUpdate({
    _id : classroomId,
    "subject" : {
        "subjectId" : subjectId,
        "subject.flashcard" : {
            "_id" : flashcardId
        }
    },
    "$set" : {
        "flashcard.title" : "new title"
    }
})

但这是删除位于对象内的所有抽认卡。 任何帮助将不胜感激。

【问题讨论】:

  • subject.flashcard 没有 _id 字段。这是一个对象数组。

标签: javascript mongodb express mongoose


【解决方案1】:

您需要arrayFilters 来指定满足subjectflashcard 条件的(待更新的)flashcard 文档。

db.collection.update({
  _id: 1//classroomId,
  
},
{
  "$set": {
    "subject.$[subject].flashcard.$[flashcard].title": "new title"
  }
},
{
  arrayFilters: [
    {
      "subject.subjectId": 1//subjectId
      
    },
    {
      "flashcard._id": 1//flashcardId
      
    }
  ]
})

Sample Mongo Playground

【讨论】:

    【解决方案2】:

    虽然我接受了@yong shun 这是最好的方法,但如果你不喜欢猫鼬语法,另一种方法是:

    
          const classroom = await classroomModel.findOne(
            {
              _id: 1 //classroomId,
            },
          )
    
          const subject = classroom.subject.find(
            (currentSubject: any) => {
              return currentSubject.subjectId == 1 //subjectId
            }
          )
    
          const flashcard = subject.flashcard.find(
            (currentFlashcard: any) => {
              return currentFlashcard._id == 1 //flashcardId
            }
          )
          flashcard.title = "my new title";
          await classroomModel.updateOne(classroom);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-31
      • 1970-01-01
      • 1970-01-01
      • 2023-01-18
      • 2022-09-23
      • 1970-01-01
      相关资源
      最近更新 更多