Mongoose -更新MongoDB数组中的嵌套对象

ars1skjm  于 2023-01-20  发布在  Go
关注(0)|答案(2)|浏览(210)

好吧,这个问题可能已经问了很多次了,但是没有一个能给我一个解决方案。
这是我的模式。

{ 
    "_id" : ObjectId("23453453453453"), 
    "title": "Item 01"
    "checkList" : [ 
            { 
                "ch_id" : "621eff4e0ed5c751adaa42fb", 
                "status" : "statu", 
                "dateMonthYear" : 1646286480139.0, 
                "val" : "Gopi", 
                "remarks" : "Good", 
                "_id" : ObjectId("7555777575") 
            }, 
            { 
                "ch_id" : "621eff4e0ed5c751adaa42fb", 
                "status" : "status", 
                "dateMonthYear" : 1646286480139.0, 
                "val" : "Gopi", 
                "remarks" : "Good", 
                "_id" : ObjectId("7555777575") 
            } 
    ]
}

我想要做的是更新checklist数组中第二个对象的status,我可以使用下面的查询来更新它。

const itemUpdated =  await Item.updateOne(
    {_id: id, 'checklist._id': req.params.id},
    {$set: { "checklist.$.status": req.body.status }},
);

但是,我想使用Mongoose方法如save()来更新这个。而不是原始查询。因为使用Mongoose方法,我得到了额外的验证层和中间件。我检查了整个互联网,但只找到了原始查询。
如何用Mongoose ORM更新数组中的嵌套对象?

piwo6bdm

piwo6bdm1#

检索Item并循环到其checkList,更新status

const item = await Item.findOne({ _id: id, 'checklist._id': req.params.id });
if (!item || item.checkList.length === 0) return;
for (let i = 0; i < item.checkList.length; i++) {
    item.checkList[i].status = req.body.status;
}
await item.save();
6tqwzwtp

6tqwzwtp2#

我终于找到了最适合这种情况的解决方案。我不知道为什么Mongoose文档写得这么差。
如果我们有一个子文档数组,我们可以使用Mongoose提供的id()方法获取我们需要的子文档。

const item = await Item.findById(id);
checkListItem = item?.checklist.id(req.params.id);

if(checkListItem){
  checkListItem.status = req.body.status;
  item?.save();
}

这对我很有效。希望有人会觉得这有用!

相关问题