gpt4 book ai didi

node.js - MongoDB 不更新双嵌套数组中的子文档(使用 Mongoose FindByIdAndUpdate)- 确切位置已知

转载 作者:可可西里 更新时间:2023-11-01 09:59:07 26 4
gpt4 key购买 nike

我有一个大致类似于以下的文档结构:

{
"_id": "theIdOfThisObject",
"subdoc": {
"array": [
[
{
"parameters": {},
"winner": null,
"participants": [
"Person1",
"Person2"
]
},
{
"parameters": {},
"winner": null,
"participants": [
"Person3",
"Person4"
]
}
],
[]
]
},
}

我完全是在尝试替换嵌套数组中的子文档之一。我不需要搜索它 - 我知道确切的位置。

例如,我试图用

替换第一个子文档
                    "parameters": {"frog":20},
"winner": "Person1",
"participants": [
"Person1",
"Person2"
]

我们会说它被保存为一个名为 newObject 的对象。

我希望下面的代码能够工作(Model 是一个真正的 Mongoose 模型):

Model.findByIdAndUpdate('theIdOfThisObject',{$set: {'subdoc.array.0.0':newObject}}, function(err,doc){
console.log('doc is returned, but nothing is updated')
});

我不知道发生了什么,也不知道为什么这不起作用。有人有什么建议吗?我使用 MongoDB 的 native Node 驱动程序已有很长时间(3 年),但 Mongoose 对我来说还很陌生。

编辑 - 根据评论请求添加架构

架构非常简单。看起来如下:

var Schema   = new mongoose.Schema({
subdoc: {
array: [{}]
}
});

那里还有其他字段,但在本例中这是唯一重要的字段。我的理解是,让 Schema 具有 [{}] 意味着将有一个任何类型的 JSON 排列的数组。该架构还允许我最初设置有问题的子文档 - 它只是不允许我出于任何原因更新它。

最佳答案

我已经解决了这个问题。显然,在将 Mixed 架构类型(与 {} 相同)与 Mongoose 一起使用时,更新对象中的子字段是一个两步过程。您不能只使用 findByIdAndUpdate()

您必须首先使用fineById(),在回调中抓取文档,在有问题的文档上运行markModified()(传递子文档的路径) ,然后最后保存所述文件。这是代码:

Model.findById('theIdOfThisObject', function(err,doc){
//update the proper subdocument
doc.subdoc.array[0][0] = newObject;
//then mark it as modified and save it
doc.markModified('brackets.rounds');
//save the model
doc.save(callback);
});

关于node.js - MongoDB 不更新双嵌套数组中的子文档(使用 Mongoose FindByIdAndUpdate)- 确切位置已知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27139924/

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