我正在尝试更新文档中对象数组中的所有键('indexOrder')。从客户端以数组的形式接收更新的值:
[{_id:'1s284hd72hdd', indexOrder: 1}, {_id:'543543531', indexOrder: 2}, etc..]我正在尝试将来自客户端的数组的_id与文档中对象的_id进行匹配。当找到匹配的->时,它需要将文档中的'indexOrder‘更新为来自客户端的数组中的值。
目前,我在客户端数组上执行循环,并在每次迭代中进行更新。
async updateIndexOrder(orderList) {
try {
orderList.forEach(async ({_id, indexOrder}) => {
await Model.findOneAndUpdate({_id}, {$set:{indexOrder}})
})
return true;
} catch (err) {
throw new Error(err);
}
}如何在一次调用中更新,而不是在这么多服务器调用中更新?类似于:
async updateIndexOrder(orderList) {
const idList= orderList.map(x => x._id)
try {
await Model.updatMany(
{_id: {$in:{idList}},
{$set: {indexOrder: orderList[FIND INDEX OF THE ITERATING _id].indexOrder}}
)
} catch (err) {
throw new Error(err);
}
}谢谢。
发布于 2020-09-08 05:11:29
您可以在mongodb 4.2和更高版本中执行此操作
exports.updateDIndexOrder = async (keyValPairArr) => {
try {
let data = await Model.collection.update(
{ _id: { $in: keyValPairArr.map(o => o._id) } },
[{
$set: {
indexOrder: {
$let: {
vars: { obj: { $arrayElemAt: [{ $filter: { input: keyValPairArr, as: "kvpa", cond: { $eq: ["$$kvpa.id", "$_id"] } } }, 0] } },
in: "$$obj.indexOrder"
}
}
}
}],
{ runValidators: true, multi: true }
)
return data;
} catch (error) {
throw error;
}
}https://stackoverflow.com/questions/63779855
复制相似问题