【发布时间】:2020-10-06 11:35:51
【问题描述】:
我有一个混合类型的猫鼬模式,如下所示:
const user = mongoose.Schema({
...
"links" : []
...
填充此架构后,我最终得到如下数据:
[
[
{
"step1": "post-url-google", // This field is unique for each entry
"step2": {
"title": "Heading 1",
"likes": 4
}
},
],
[
{
"step1": "post-url-microsoft",
"step2": {
"title": "Heading 1",
"likes": 1
}
},
{
"step1": "post-url-apple",
"step2": {
"title": "Heading 2",
"likes": 6 // I want to update this to 7
}
}
]
]
我想要实现的是将 "step1": "post-url-apple" 字段从 6 更新为具有 7 的 likes
所以我尝试像这样使用User.save() 函数:
let user = await User.findOne({"_id" : "some_id"})
user.links[1].some(object => {
if (object.step1 === "post-url-apple") {
object.step2.likes = 7
(async function (){
user.save() // I also did error handling
})()
return
}
})
此方法工作正常,用户得到更新,但它不断抛出 ParallelSaveError 可能是因为我在代码的其他部分中的同一用户实例上并行调用 save() 函数。
所以我决定使用User.findOneAndUpdate() 方法,但是在使用mongodb 点符号$[<identifier>] 时我的查询一直失败,显然是因为我不知道如何正确使用它。
像这样:
let update = {
"$set" : {
"links.$[index1].$[index2].step2.likes" : 7,
}
}
let conditions = {
arrayFilters : [
{"index1" : 1},
{"index2.step1" : "post-url-apple"}
]
}
try {
let result = await Users.findOneAndUpdate({"_id" : "some_id"}, update, conditions)
console.log(result)
} catch (err) {
console.log(err)
}
出于所有充分的理由,我没有点击 catch 块,但更新同样不成功
如何使用findOneAndUpdate 将"step1": "post-url-apple" likes 字段更新为7?
谢谢。
【问题讨论】:
标签: node.js mongodb express mongoose mongodb-query