首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongoose -从Ids数组更新多个Ids

mongoose -从Ids数组更新多个Ids
EN

Stack Overflow用户
提问于 2020-09-07 22:46:27
回答 1查看 377关注 0票数 0

我正在尝试更新文档中对象数组中的所有键('indexOrder')。从客户端以数组的形式接收更新的值:

代码语言:javascript
复制
[{_id:'1s284hd72hdd', indexOrder: 1}, {_id:'543543531', indexOrder: 2}, etc..]

我正在尝试将来自客户端的数组的_id与文档中对象的_id进行匹配。当找到匹配的->时,它需要将文档中的'indexOrder‘更新为来自客户端的数组中的值。

目前,我在客户端数组上执行循环,并在每次迭代中进行更新。

代码语言:javascript
复制
  async updateIndexOrder(orderList) {
    try {
      orderList.forEach(async ({_id, indexOrder}) => {
        await Model.findOneAndUpdate({_id}, {$set:{indexOrder}})
      })
      return true;

  } catch (err) {
    throw new Error(err);
  }
}

如何在一次调用中更新,而不是在这么多服务器调用中更新?类似于:

代码语言:javascript
复制
  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);
  }
}

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-09-08 05:11:29

您可以在mongodb 4.2和更高版本中执行此操作

代码语言:javascript
复制
    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;
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63779855

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档