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)
我正在尝试为嵌入式文档实施一个简单的 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)