使用 mongoose 将字符串数组推送到 mongoDB

Posted

技术标签:

【中文标题】使用 mongoose 将字符串数组推送到 mongoDB【英文标题】:push array of strings to mongoDB with mongoose 【发布时间】:2021-02-17 13:37:06 【问题描述】:

我不确定如何使用 mongoose 将输入字段中的字符串数组保存到 mongoDB。

理想情况下,我想在创建数组的同一输入字段中多次输入文本。所以我最终会得到这样的东西。

title: "这是我的标题"

动作:[“走路”、“微笑”、“大笑”]

EJS 文件:

<form action="/blogs" method="POST">
        <input type="text" placeholder="title" name="title" id="title" > 
        <input type="text" name="actions" id="actions" > 
    <button >submit</button>
</form> 

blog.js

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const blogSchema = new Schema(
  
    title: 
      type: String,
      required: true,
    ,
    actions: [
      
        type: String,
      ,
    ],
  ,
   timestamps: true 
);

const Blog = mongoose.model("Blog", blogSchema);
module.exports = Blog;

app.js

app.post('/blogs', (req, res) =>  
  
  const blog = new Blog (
    title: req.body.title,
    actions: req.body.tags,
  );


  blog.save()
  .then((result) => 
    res.redirect('/blogs')
    
  )
  .catch((erro) => 
    console.log(erro)
  )
)

关于如何解决这个问题的任何指南?目前我唯一的解决方案是创建多个输入字段,但这是不正确的。

【问题讨论】:

【参考方案1】:

您可能正在将数组作为字符串发送到 mongo。您可以通过检查 req.body.tags 的类型来检查这一点,如下所示:

console.log(typeof req.body.tags)

如果这返回一个字符串,请确保将内容作为 JSON 发送到数据库。

【讨论】:

【参考方案2】:

如果actions 标签是预定义的并且是特定的,您可以使用html select multiple。这样操作属性将作为字符串数组发送

<form action="/blogs" method="POST">
        <input type="text" placeholder="title" name="title" id="title" > 
        <label for="actions">Actions:</label>
        <select name="actions" id="actions" multiple>
            <option value="walking">walking</option>
            <option value="smiling">smiling</option>
            <option value="laughing">laughing</option>
        </select>
    <button >submit</button>
</form>

在控制器内部,您可以这样处理

  // req.body.actions is already an array.
  const blog = new Blog(req.body);
  blog.save()
  .then((result) => 
    res.redirect('/blogs')
    
  )
  .catch((erro) => 
    console.log(erro)
  )

在任何情况下,如果您想使用文本输入来编写以空格或逗号分隔的操作,则操作属性将作为字符串发送。然后你可以在控制器内部将字符串转换为数组。

// In case of multiple spaces, replace with single space. 
// Then split string to array of strings
let actions = req.body.actions.replace(/ +/g, " ").split(" ")

const blog = new Blog (
    title: req.body.title,
    actions
);
// rest of code

无论您选择做什么,操作都将作为字符串数组存储在数据库中。

【讨论】:

以上是关于使用 mongoose 将字符串数组推送到 mongoDB的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose push() 函数没有将数据推送到数组中

将对象 ID 推送到嵌套数组 MongoDB/Mongoose

如何将新值推送到 Mongoose 中的嵌套数组

Mongoose 无法将新对象推送到父数组

是否可以将 Mongoose obj 模式推送到数组中?

如何通过 mongoose 将多个数组元素推送到 mongodb