Mongodb: 创建嵌入文档 - 获取 Id

Mongodb: Create embedded document - get Id

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

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

查询如下所示:

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

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

我现在要return新创建的子公司(包括ID)。 鉴于我的数据中没有任何其他标识符 - 我如何才能找到哪个是新创建的文档?

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

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

Without the $position modifier, the $push appends the elements to the end of the array.

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

// 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 .

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

我们可以使用 $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)