gpt4 book ai didi

node.js - MongoDB 更新数组中的数组对象

转载 作者:可可西里 更新时间:2023-11-01 09:47:39 24 4
gpt4 key购买 nike

模型结构:

{ _id: String, calc: [ { preset: String, datasets: [ { _id: String } ] } ] }

API 路由:

router.put('/:gameId/:preset/:datasetId', (req, res) => {
Game.findOneAndUpdate({ _id: req.params.gameId, 'calc.preset': req.params.preset, 'calc.datasets._id': req.params.datasetId },
{ $set: { 'calc.$.datasets.$': req.body } })
.then(() => res.status(200).json({ ...req.body, _id: req.params.datasetId }))
.catch(err => res.status(500).json({ error: err }));
});

如果我要更新 calc 数组中的对象,那么我会:$set: { 'calc.$': newCalc },所以我采用相同的方法来更新一个对象在数据集数组内部,在对象内部,在 calc 数组内部,但是,$set: { 'calc.$.datasets.$': newDataset } 不起作用。

如何使用 _id 更新对象:req.params.datasetId,在数据集数组内,即在预设:req.params.preset 的 calc 数组对象内?

简而言之: { calc: [ { datasets: [ { set this object to a new dataset } ] } }

最佳答案

你可以使用$[] positional-all更新嵌套数组元素,mongo doc for $[]

查询

db.t14.update(
{},
{ $set: { "calc.$[].datasets.$[elem].name": "updated" } },
{ arrayFilters: [ { "elem": "x1" } ], multi: true}
)

带有文档的示例集合

> db.t14.findOne()
{
"_id" : 1,
"calc" : [
{
"preset" : "abc",
"datasets" : [
{
"_id" : "x1",
"name" : "n1"
},
{
"_id" : "x2",
"name" : "n2"
}
]
}
]
}

更新

> db.t14.update({},{$set: { "calc.$[].datasets.$[elem].name": "newname" } },{ arrayFilters: [{ "elem.name": "n1" }], multi: true})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

发布更新

> db.t14.findOne()
{
"_id" : 1,
"calc" : [
{
"preset" : "abc",
"datasets" : [
{
"_id" : "x1",
"name" : "newname"
},
{
"_id" : "x2",
"name" : "n2"
}
]
}
]
}
>

关于node.js - MongoDB 更新数组中的数组对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53972506/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com