当前位置: 首页 > 知识库问答 >
问题:

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

程和煦
2023-03-14

我想在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; 

出版商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;

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

服务器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}`));

有人让我知道如何执行这项任务。

共有1个答案

西门伟
2023-03-14

您将获得CastError,因为mongoDB仅接收游戏数组模式字段类型的字符串“San and”。

在Postman中,您需要将games键更改为games[0][name]才能将“San and”作为游戏名称@turivishal和@KunalMukherjee在最初的评论中都提到了这一点。要添加额外的数组项,可以在Postman中使用x-www-form-urlencoded

键:games[0][name]value:San和
键:games[0][date]值:2020-01-01键:games[1][name]值:伟大的游戏键:games 1][date。。。

或者,您可以通过选择rawpost body entry方法而不是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或本地服务器实例。通过以下步骤设置Cloud Atlas。

在问题更新之前,您似乎忘记了从req中提取游戏数组。服务器中的body。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);
}

 类似资料:
  • 我是mongoDB的新手,但我对couchDB非常了解。在couchdb中,我们有JSONObject和JSONArray,所以我们可以轻松地在文档中插入任何内容,比如 我想做下面这样的事情 所以这里有一个字符串列表,也可以是jsonarray或任何字符串数组,整数类型,这个数组放在文档的键名“master”上。 这是关于如何在mongodb中插入数组的全部想法。 我使用BasicBobObjec

  • 我在一个名为course的模式中有一个名为students的数我创建了一个路由,允许我使用学生的将学生添加到这个数组中,如下所示: 当我尝试用以下JSON体向我的endpoint发出PUT请求时: 谢谢!

  • 在我的问题的答案中给出了如何使用Mongoose来使用新的运算符的很好的解释。建议的解决方案非常适合简单的数组。如果数组在子文档中或数组的每个元素都是数组,则建议的解决方案不起作用。我的意思是这样的:

  • 本文向大家介绍在MongoDB中将数据插入内部数组?,包括了在MongoDB中将数据插入内部数组?的使用技巧和注意事项,需要的朋友参考一下 您可以为此使用$addToSet运算符。首先让我们创建一个包含文档的集合- 以下是在方法的帮助下显示集合中所有文档的查询- 这将产生以下输出- 以下是将数据插入MongoDB的内部数组中的查询- 让我们再次检查文档- 这将产生以下输出-

  • b)“Units”字段包含带有“period”字段的子文档(日期对象数组),其中给定的日期位于数组中的第一和第二元素之间。 数据结构如下所示: 我尝试使用.find()和.aggregate()的各种组合,例如在periol数组上使用$project和$filter,在unit._id上使用$elemmatch之后使用$elemmatch,但是没有用--我得到了诸如“不能在数组上使用$filter

  • 当前,我有一个数组,当通过print_r()输出时,该数组如下所示; 我想将此数据插入到一个表中,每个元素值都属于其各自的字段。 问候。