Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb mongoose-从ID数组中更新多个ID_Mongodb_Mongoose_Mongodb Query - Fatal编程技术网

Mongodb mongoose-从ID数组中更新多个ID

Mongodb mongoose-从ID数组中更新多个ID,mongodb,mongoose,mongodb-query,Mongodb,Mongoose,Mongodb Query,我正在尝试更新文档中对象数组中的所有键(“indexOrder”)。 更新的值作为数组从客户端接收: [{_id:'1s284hd72hdd', indexOrder: 1}, {_id:'543543531', indexOrder: 2}, etc..] 我正在尝试将来自客户端的数组的_id与文档中对象的_id进行匹配。当找到匹配项->它需要从客户端将文档中的“indexOrder”更新为其数组中的值 目前,我在客户端阵列上循环,并为每次迭代进行更新 async updateIndex

我正在尝试更新文档中对象数组中的所有键(“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);
  }
}

谢谢。

您可以在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;
    }
}