提问者:小点点

Mongoose updateMany(按id使用节点)


是否可以通过ID更新对象数组?例:

这是我的阵列:

[
  {
        "_id": "5fdb614d686e671eb834a409",
        "order": 1,
        "title": "first"
  },
  {
        "_id": "5fdb61c0686e671eb834a41e",
        "order": 2,
        "title": "second" 
  },
  {
        "_id": "5fdb61d6686e671eb834a424",
        "order": 3,
        "title": "last"
  }
]

我只想更改每个by ID的顺序。我正在使用Node,我试着这样做:

router.post("/edit-order", auth, async (req, res) => {
  try {
    const sections = await Section.updateMany(
      req.body.map((item) => {
        return { _id: item._id }, { $set: { order: item.order } };
      })
    );

    res.json(sections);
  } catch (e) {
    res.status(500).json({ message: "Something went wrong in /edit-order" });
  }
});

我的请求正文是:

[
    {
        "_id": "5fdb614d686e671eb834a409",
        "order": 2
    },
    {
        "_id": "5fdb61c0686e671eb834a41e",
        "order": 3
    },
    {
        "_id": "5fdb61d6686e671eb834a424",
        "order": 4
    }
]

但结果,我得到了:

[
  {
        "_id": "5fdb614d686e671eb834a409",
        "order": 4,
        "title": "first"
  },
  {
        "_id": "5fdb61c0686e671eb834a41e",
        "order": 4,
        "title": "second" 
  },
  {
        "_id": "5fdb61d6686e671eb834a424",
        "order": 4,
        "title": "last"
  }
]

因此,它按请求数组的最后一个值改变每个顺序。我该怎么做。如果您知道任何其他解决方案,请随意分享,我所需要的只是通过ID更改顺序。


共1个答案

匿名用户

好吧,因为您对每个项目都有不同的order值,所以您需要做一个Bulkwrite。

router.post('/edit-order', auth, async (req, res) => {
  try {
    const writeOperations = req.body.map((item) => {
      return {
        updateOne: {
          filter: { _id: item._id },
          update: { order: item.order }
        }
      };
    });

    await Section.bulkWrite(writeOperations);

    res.json(req.body);
  } catch (e) {
    res.status(500).json({ message: 'Something went wrong in /edit-order' });
  }
});

如果所有项都只有一个order值,则可以使用updatemany$in

router.post('/edit-order', auth, async (req, res) => {
  try {
    const sectionsIds = req.body.map((item) => {
      return item._id;
    });
    const sections = await Section.updateMany(
      { _id: { $in: sectionsIds } },
      { order: 'A single value for all sections in body' }
    );

    res.json(sections);
  } catch (e) {
    res.status(500).json({ message: 'Something went wrong in /edit-order' });
  }
});