0

我正在尝试Create为嵌入式文档实现一个简单的 CRUD。

网址是这样的[POST] /restaurants/:id/subsidiaries

查询如下所示:

const restaurant = await Restaurant.findByIdAndUpdate(req.params.id, {
  $push: {
    subsidiaries: {
      phone,
      email,
      title,
      ...
    },
  },
})

我正在使用猫鼬 - 所以这会自动为子公司创建一个 ID。

我现在想返回新创建的子公司(包括 ID)。鉴于我的数据中没有任何其他标识符 - 我如何找到新创建的文档?

我知道 Mongo 鼓励嵌入文档 - 但我找不到任何关于如何处理典型(我发现一个非常典型的案例)REST/CRUD 问题的信息。

4

2 回答 2

0

也可以将文档作为第一个子元素添加到数组中(最新的第一顺序)。

我们可以使用$position: 0来实现这一点——但它也需要将嵌入的文档放入$each: []数组中。

有代码:

const restaurant = await Restaurant.findByIdAndUpdate(
  req.params.id,
  {
    $push: {
      subsidiaries: {
        $each: [
          {
            phone,
            email,
            title,
            ...
          },
        ],
        $position: 0,
      },
    },
  },
  { new: true }
)

if (!restaurant) return res.sendStatus(500)

const subsidiary = restaurant.subsidiaries[0]
res.send(subsidiary)
于 2020-09-09T05:18:36.683 回答
0

答案可以在 mongodb $push 修饰符文档https://docs.mongodb.com/manual/reference/operator/update/push/#modifiers中找到

如果没有 $position 修饰符, $push 会将元素附加到数组的末尾。

所以我们知道,添加的元素将是返回的嵌入文档数组中的最后一个元素。

// Question
const restaurant = await Restaurant.findByIdAndUpdate(req.params.id, {
  $push: {
    subsidiaries: {
      phone,
      email,
      title,
      ...
    },
  },
}, { new: true })

// Answer
if (!restaurant) return res.sendStatus(500)

const newlyCreatedSubsidiary = restaurant.subsidiaries.slice(-1)[0]
res.send(newlyCreatedSubsidiary)

不要忘记将其包装成try-catch.

于 2020-09-09T05:05:54.363 回答