Mongodb 将 json 从 http.post 插入到集合中会更改 json



我正在使用mongodb,nodejs等为我的移动应用程序制作一个管理页面。我正在尝试将现有的 json 文件插入到 mongodb 集合中。我尝试了 mongoimport,但它只是不起作用(我通读并尝试了几次关于它的堆栈溢出讨论)。所以我发现我可以通过 http POST 发送它并使用 insert()。

我有三个本地主机服务器正在运行:mongodb,应用程序服务器和网站管理页面

JSON 文件如下所示:

{"data_version":1,"drivers_teams":{"drivers":{"4":{"name":"Hofer","firstname": ... }}}

客户端发布

    $.getJSON("initialData.json", function(json) {
            $.ajax({
              url: 'localhost:3080/client_data',
              type: 'POST',
              data: json,
              success: function(res) {
                console.log(res);
              }.bind(this),
              error: function(xhr, status, err) {
                console.error(url, status, err.toString());
              }.bind(this)
            });
    }.bind(this));

服务器开机自检

app.use(bodyParser.json({limit: '1000kb', parameterLimit: 5000}));
app.use(bodyParser.urlencoded({limit: '1000kb', parameterLimit: 5000, extended: false}));
    app.post('/client_data/', (req, res) => {
      const db = req.db;
      const collection = db.get('collection');
      collection.insert(req.body, function (err, doc) { 
            if (err) {
              res.status(500).send('Invalid request');
              return;
            }  
            res.send('ok');
      });
    });

到目前为止一切顺利,但是在我设法插入数据并询问服务器您得到了什么之后? 我得到:

{"_id":"57872f9fe51246dc1b3bbc93","data_version":"1","drivers_teams[drivers][4][name]":"Hofer","drivers_teams[drivers][4][firstname] ... }}}

我不能再使用这些数据了。所以问题:当嵌套的 json 来自 http 请求正文时,我如何按原样插入它?

编辑

好的,弄清楚了如何执行 AS-IS 插入()。而不是 http.post 我将 json 直接加载到集合中;

服务器

import mydata from './initialData.json';
...
collection.insert(mydata, function (err, doc) { ... });

仍然对我在请求正文中做错了什么感到困惑。因为现在如果我做收集.更新();从客户端更新的元素显然被括号符号搞砸了。

解决方案是更改 url 编码的 bodyParser 选项

app.use(bodyParser.urlencoded({ extended: true }));

至少对我来说,这确实是违反直觉的,因为我正在寻找与 JSON 相关的问题,而不是表单......唯一的背面是一切都是字符串而不是它们的真实类型,但一旦我走到这一步,我就不在乎了。

编辑

为了在服务器端获取数据类型,我需要 JSON.stringify(data) 并在 POST 选项中添加 contentType:"application/json"

    post: function(data) {      
        $.ajax({
            url: url,
            type: 'POST',
            data: JSON.stringify(data),
            contentType: 'application/json',
            success: function(res) {
                console.log(res)
            }.bind(this),
            error: function(xhr, status, err) {
                console.error(url, status, err.toString());
            }.bind(this)
        });
    },

最新更新