【问题标题】:Mongodb: Create embedded document - get IdMongodb:创建嵌入式文档 - 获取 Id
【发布时间】:2020-12-27 11:47:58
【问题描述】:

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

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

查询如下所示:

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

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

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

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

【问题讨论】:

    标签: node.js mongodb mongoose embedded-documents


    【解决方案1】:

    答案可以在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?。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-26
        • 2016-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多