尝试保存对象 ID 猫鼬数组的问题

Issue Trying to Save an Array of Object Ids Mongoose

我正在使用 mongooseexpress 分别创建我的数据库和服务器。

我的数据有如下架构:

const mongoose = require('mongoose')
const {Schema} = mongoose

const quotesSchema = new Schema({
  tags: [
    {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Tags' // I want to save an array of tags coming in from the request body
     }
   ],
  content: {
     type: String,
     required: true
  },
  author: {
     type: String,
     required: true
  },
  authorSlug: {
     type: String,
  },
  dateAdded: {
     type: Date,
     default: Date.now()
  },
   dateModified: {
      type: Date,
      default: Date.now()
   },
})

const Quotes = new mongoose.model('Quotes', quotesSchema)
module.exports = Quotes

我想保存来自请求正文的一组标签,但它只保存了数组中的一项。

这是我的示例代码:

router.post('/', async (req, res, next) => {
try {
    const {tags, author, content} = req.body
    const slug = author.replace(/\s+/g, '-').toLowerCase()

    var tagIds = []
    
    tags.forEach( async (tag) => {
        const foundTag = await Tag.find({name: tag}) // I first of all search my tag collection 
 // to see if the names supplied in the request body tags array exist, 
 // then try to extract their Objectids and store in an array to move to the next step - saving the quote

        // foundTag.forEach(async (item) => {
        //     return await tagIds.push(item._id)
        // })            

        for (var i = 0; i < foundTag.length; i++) {
            tagIds.push[i]
        }

        console.log(tagIds)
        
        const quote = new Quote({
            tags: tagIds,
            content,
            author,
            authorSlug: slug
        })

        const quoteToSave = await quote.save()

        return res.status(201).json({
            success: true,
            msg: 'Quote Created Successfully',
            quote: quoteToSave
        })

     })
  } catch (error) {
     console.error(error)
  }
})

如何将完整的标签数组作为参数传递给我的报价以进行保存。我认为这里的问题是它没有等待第二个标签进入数组。

这是我在 Postman 中请求-响应的图片:

如何从 req.body 中获取作为数组的标签并将其保存为我的引用对象的一部分?目前我正在 forEach 循环中做所有事情,但对我来说似乎不够体面。有没有最好的方法,比如等待数据,然后保存部分不会像当前那样有任何父控制语句。

谢谢

#1 如果您将在 forEach 中使用 async functions,则将 Promise.all()bluebird 一起使用。

#2 MongoDB operators 很有用。

#3 了解 forEachmap 之间的区别非常重要。

#4 express response 正确使用的话不需要return声明


最终代码如下所示:

router.post('/', async (req, res, next) => {

    const { tags, author, content } = req.body
    const slug = author.replace(/\s+/g, '-').toLowerCase()

    var foundTags = await Tag.find({ name: { $in: tags } })

    if (foundTags) {

        var tagsIds = []
        foundTags.map(tag => {
            tagsIds.push(tag._id);
        })

        const quote = new Quote({
            tags: tagsIds,
            content,
            author,
            authorSlug: slug
        })

        const quoteToSave = await quote.save()

        if (quoteToSave) {
            res.status(201).json({
                success: true,
                msg: 'Quote Created Successfully',
                quote: quoteToSave
            })
        } else {
            res.status(500).json("failed saving quote")
        }
    } else {
        res.status(500).json("failed finding tags")
    }
})