如何使用 mongoose 和 NodeJs 在 Mongodb 的数组字段中插入数据

Posted

技术标签:

【中文标题】如何使用 mongoose 和 NodeJs 在 Mongodb 的数组字段中插入数据【英文标题】:How to insert data in array field in Mongodb using mongoose and NodeJs 【发布时间】:2021-11-25 02:21:08 【问题描述】:

我想在 mongodb 中插入数据,其中一个字段是对象类型的数组。我无法了解如何将数据与 mongoose 模式中定义的其他字段一起添加到数组字段中。当我尝试使用具有以下配置的 POSTMAN 发布数据时,如屏幕截图所示:

它的显示游戏数组是空的并且显示下面的错误

 games: CastError: Cast to embedded failed for value "'San and'" (type string) at path "games"

下面是我的代码:

db.js

const mongoose = require('mongoose');
const dotEnv = require('dotenv').config();

const uri = process.env.URI;

const connect = mongoose.connect(uri,useNewUrlParser:true,useUnifiedTopology:true)
                .then(() => console.log("Database connected"))
                .catch((err) => 
                   console.log("Something went wrong",err);
                   process.exit(1);
               );

module.exports = connect; 

publisher.js

const mongoose = require('mongoose');

const publisherSchema = new mongoose.Schema(

  company_name:
    type: String
  ,
  website:
    type: String
  
  games: [
    date: Date,
    name: String
   ]

 );

const publisher = mongoose.model('Publisher',publisherSchema);
module.exports = publisher;

可以按照下面的代码插入两个字段,但是如何添加数组字段以及这两个字段。

server.js

const express = require('express');
const connect = require('./db.js');
const publisher = require('./models/publisher.js');
const gaming = require('./models/game.js');

const app = express();

const port = process.env.PORT || 3000;

app.use(express.json());
app.use(express.urlencoded( extended: true ))

app.post('/publish',async (req,res) => 

const  company_name,website,games  = req.body;

const insert = new publisher(company_name,website,games);

try
    const data = await insert.save();
    res.send(data); 

catch(err)
    console.log(err);


);

app.listen(port, () => console.log(`App is up and runnning at $port`));

请告诉我如何执行此任务。

【问题讨论】:

与其他2个字段相同,只需将第三个数组字段与其他字段一起传递即可。 我试过了,但它没有插入到数组字段中。我已经在我的帖子中附上了 POSTMAN 的屏幕截图。 您没有在实际代码new publisher(company_name,website); 中传递该字段,其次邮递员请求数组字段的值为字符串,更改键名games[0] 并在请求中添加新字段并增加索引以获取更多索引。 你从邮递员那里传错了游戏数组,像this一样传。同样正如@turivishal 所说,解构控制器中的游戏属性并将其放入 Publisher 构造函数中。 它在解构游戏值后显示此错误并将其添加为一个字段`游戏:CastError: Cast to embedded failed for value "'San and'" (type string) at path "games"` 【参考方案1】:

您得到的是CastError,因为 mongodb 只接收 games 数组架构字段类型的字符串“San and”。

在 Postman 中,您需要将 games key 更改为 games[0][name] 才能传递“San and”作为游戏名称。 @turivishal 和 @KunalMukherjee 在原始 cmets 中都提到了这一点。要添加其他数组项,您可以在 Postman 中这样做,使用 x-www-form-urlencoded

键:games[0][name] 值:San and 键:games[0][date] 值:2020-01-01 键:games[1][name] 值:The Great Game 键:games[1][date] 值:2020-01-02 等等……

或者,您可以通过选择raw 帖子正文输入方法而不是x-www-form-urlencoded 直接编写JSON。像这样:


    "company_name": "roveo",
    "website": "www.ro.com",
    "games": [
        
            "date": "2020-01-01",
            "name": "San and"
        ,
        
            "date": "2020-01-02",
            "name": "The Great Game"
        
    ]

这是我使用这种方法在 PostMan 中得到的输出:

以及 MongoDB 中的 DB 文档:

这是带有工作代码的 github 存储库:https://github.com/angusryer/mongo-play

您必须将 mongodb uri 指向您自己的 Cloud Atlas 或本地服务器实例。通过these steps here 设置 Cloud Atlas。


在更新问题之前,您似乎忘记了从 req.body 中的 server.js 中提取游戏数组:

const  company_name, website, games  = req.body; // <-- missed `games`

const insert = new publisher(company_name, website, games); // <-- and `games` here too

try
    const data = await insert.save();
    res.send(data); 

catch(err)
    console.log(err);


【讨论】:

在执行您的解决方案时显示此错误`游戏:CastError: Cast to embedded failed for value "'San and'" (type string) at path "games"` 很晚了,但为了后代,我已经更新了答案。 它不工作的数组仍然是空的 这很奇怪。在我第一次发送这个 POST 请求时,mongo db 由于某种原因没有收到数组。这可能是我的缓存错误 - 不确定。无论哪种方式,每个后续的 POST did 都表现正常,所以我更新了我的答案以显示我得到的结果。我相信这回答了最初的问题。如果它仍然无法正常工作并且您拥有上述所有代码,那么可能还有另一个问题。

以上是关于如何使用 mongoose 和 NodeJs 在 Mongodb 的数组字段中插入数据的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongoose 和 nodejs 删除嵌套在 Post 模式中的评论?

如何使用 Mongoose、Express、Angular 4 和 NodeJS 上传/保存和显示图片

如何在 NodeJS 和 Mongoose 中填充需要引用用户名的帖子

如何在 Express 和 NodeJS 中针对 Mongoose 错误进行错误处理。

如何使用 Nodejs/mongodb/mongoose 在 ejs/html 中显示数据库项目?

如何对使用 Express + Mongoose 构建的 NodeJs REST API 服务器进行单元测试?