更新嵌套数组

我有一个这样的调查表:

{
id:id,
日期:日期:,
客户:[{
客户id:id,
联系人:[{
联系人_id:id,
分数:数字,
反馈:字符串,
电子邮件:String
}]
}]
}

我需要更新特定联系人下的得分反馈字段。目前,我正在运行更新,如下所示:

函数保存分数(obj){
var dfd=q.defer();
var survey=surveys.get(obj.survey\u id);
调查
.pluck({clients:'contacts'})
.run()
。然后(结果=&gt{
结果.客户.forEach((项目,外部索引)=&gt{
item.contacts.forEach((项、索引、数组)=&gt{
if(编号(项目联系人id)==编号(目标联系人id)){
数组[index].score=obj.score;
日志(outerIndex,index);
}
});
});
返回调查。更新(结果)。运行()
})
。然后(结果=>dfd.resolve(结果))
.catch(err=>dfd.resolve(err));
回报dfd承诺;
};

当我查看update方法时,它指定如何更新嵌套的key:value对。但是,我找不到任何示例来更新数组中的单个项

有没有更好、更干净的方法来更新嵌套数组中的项

您可能需要获取数组,过滤出数组中所需的值,然后再次将其附加到数组中。然后可以将更新后的数组传递给update方法

示例

假设您有一个包含两个客户端的文档,这两个客户端都有名称分数,您希望更新其中一个客户端的分数:

{
“客户”:[
{
“姓名”:“雅各布”,
“分数”:200分
} ,
{
“姓名”:“豪尔赫”,
“得分”:57分
}
] ,
“id”:“70589f08-284c-495a-b089-005812ec589f”
}

您可以获取该特定文档,使用annonymous函数运行update命令,然后将更新后的新数组传递到clients属性中

r.table('jacob').get(“70589f08-284c-495a-b089-005812ec589f”)
.更新(功能(行){
返回{
//获取所有客户端,除了我们要更新的客户端
客户端:行(“客户端”).filter(函数(客户端){
返回客户端('name').ne('jorge'))
})
//附加一个新的客户端和更新信息
.append({name:'jorge',分数:57})
};
});

我确实认为这有点麻烦,可能有一种更好、更优雅的方法,但这应该能解决你的问题

数据库架构

也许值得为您的所有联系人创建一个contacts表,然后对您的数据进行某种连接。然后,客户端数组中的联系人属性将类似于:

{
id:id,
日期:日期:,
客户:[{
客户id:id,
联系大学分数:{
Id:分数(数字)
},
联系单位反馈:{
Id:反馈(字符串)
}
}]
}

发表评论