如何在mongoose中更新同一查询中数组中的不同对象?

66bbxpm5  于 9个月前  发布在  Go
关注(0)|答案(2)|浏览(106)

这是我的mongoose schema:

const humanSchema = mongoose.Schema({
    id: String,
    person: [
        id: String,
        age: Number,
        sex: String,
        height: String
    ],
    employment: Boolean
});

字符串
这是我的JSON body请求,我试图通过postman作为PUT传递:

"humanID": "12345"
"personUpdate": {
  "humanAdultId": "6789",
  "age": 37,
  "sex": "male",
  "height": "5ft"
}


这是我正在尝试更新的“人类”数据库记录:

"id": "12345"
"person": [
{
  "id": "4321",
  "age": 21,
  "sex": "female",
  "height": "4ft"
},
{
  "id": "6789",
  "age": 35,
  "sex": "male",
  "height": "6ft"
},
{
  "id": "7654",
  "age": 27,
  "sex": "male",
  "height": "5ft"
}
]


我尝试使用JSON body来更新数组中的第二个对象。我想更新它的值:年龄和身高。
我想通过调用整个记录的ID(humanID),然后调用对象ID(humanAdultId)来进一步深入到我需要的对象。我已经研究了$pull和$push路由,但必须有一个更简单的方法来做到这一点。什么是最好的方法来实现这一点?

m3eecexj

m3eecexj1#

你应该使用一个简单的更新与arrayFilters!
有关详细信息,请参阅此处的文档:https://www.mongodb.com/docs/v7.0/reference/method/db.collection.update/#specify-arrayfilters-for-array-update-operations
以下内容应该可以工作:

humanCollection.findOneAndUpdate(
  {_id : myJson.humanId},
  {$set : {"person.$[myHumanAdult]" : myJson.person},
  {arrayFilters : [{"myHumanAdult.humanAdultId" : myJson.person.humanAdultId}]}
)

字符串

x759pob2

x759pob22#

您的架构中有Human.idHuman.person.id属性,但您的数据库文档显示Human.humanIDHuman.person.humanAdultId。它们需要具有相同的键,idhumanIDhumanAdultId
假设您的模式应该是humanIDhumanAdultId,那么基于您的模式,Human.humanIDHuman.person.humanAdultId值都是String类型。因此,您可以找到与jsonData.humanID匹配的Human,并从person数组中挑选出person.humanAdultId等于jsonData.person.humanAdultId的对象,如下所示所以:

const human = await Human.findOneAndUpdate(
{
   humanID: jsonData.humanID,
   person: {
       $elemMatch: {
          humanAdultId: jsonData.person.humanAdultId,
       }
   } 
},
{
   $set : {
      "person.$" : jsonData.person
   }
},
{new: true}
);

字符串

相关问题