将 json 从 API 调用插入到 mongodb 中



我对node.js和mongodb都很新鲜,但到目前为止我真的很喜欢它。我正在尝试进行 API 调用并将收到的数据插入 mongodb。顺便说一下,使用 cloud9 IDE。

在SO

上,现在我只找到了有关导入json文件的帖子,例如将json文件插入mongodb

var url = "API CALL HERE"
request(url, function(error, response, body){
     if(!error && response.statusCode == 200){
        var data = JSON.parse(body);
        res.send(data);
        var MongoClient = require('mongodb').MongoClient;
        var url = "mongodb://localhost:27017/mydb";
        MongoClient.connect(url, function(err, db) {
          if (err) throw err;
          var myobj = data;
          db.collection("dabas").insertMany(myobj, function(err, res) {
            if (err) throw err;
            console.log("Number of documents inserted: " + res.insertedCount);
            db.close();
          });
        });
     }
});

json 文件中的示例如下所示:

// 20171013085454
// http://api.dabas.com/DABASService/V2/article/GTIN/07310100774460/json?apikey=2d2fbadc-dbe1-420f-a777-65912d65e388
{
  "Artikelbeskrivning": null,
  "Artikelegenskap": null,
  "Produktkod": "103511784459 / Kolonial/Speceri -- Kakao/Chokladdryck -- Kakaopulver -- Kakaopulver",
  "OvrigObligatoriskMarkning": null,
  "MaximalaAntaletMinstaEnheterIforpackningen": 0,
  "Hyllkantstext": "Kakaopulver 20-22",
  "Storlek": "1kg",
  "TullstatistisktNummer": null,
  "Varningsetiketter": [
  ],
  "Sasongskoder": [
  ],
  "Produktklasser": [
  ],
  "MaskinellMarkningar": [
    {
      "MaskinellMarkning": null,
      "TypAvMarkning": null,
      "Databarartyp": "EAN UPC"
    }
  ]}

运行时,我收到以下错误消息:

/home/ubuntu/workspace/Projects/Mathubben/node_modules/mongodb/lib/mongo_client.js:433
          throw err
          ^
MongoError: docs parameter must be an array of documents
    at Function.MongoError.create (/home/ubuntu/workspace/Projects/Mathubben/node_modules/mongodb-core/lib/error.js:31:11)
    at Collection.insertMany (/home/ubuntu/workspace/Projects/Mathubben/node_modules/mongodb/lib/collection.js:501:32)
    at /home/ubuntu/workspace/Projects/Mathubben/app.js:26:38
    at connectCallback (/home/ubuntu/workspace/Projects/Mathubben/node_modules/mongodb/lib/mongo_client.js:515:5)
    at /home/ubuntu/workspace/Projects/Mathubben/node_modules/mongodb/lib/mongo_client.js:430:11
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickCallback (internal/process/next_tick.js:104:9)

这是插入许多问题所在

 db.collection("dabas").insertMany(myobj, function(err, res) {

使用时

 db.collection("dabas").insert(myobj, function(err, res) {

它工作正常

insertMany 方法接受文档数组

insertMany([ <doc 1> , <doc 2>, ... ],{
  writeConcern: <document>,
  ordered: <boolean>
  }
)

您正在传递一个对象。

解决方案 1:假设您将收到 body 参数的单个对象,您可以按如下方式修改代码:

request(url, function(error, response, body){
 if(!error && response.statusCode == 200){
    var data = []
    var data.push(JSON.parse(body));
    res.send(data);
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/mydb";
    MongoClient.connect(url, function(err, db) {
      if (err) throw err;
      var myobj = data;
      db.collection("dabas").insertMany(myobj, function(err, res) {
        if (err) throw err;
        console.log("Number of documents inserted: " + res.insertedCount);
        db.close();
      });
    });
 }
});

解决方案 2:需要修改代码才能在数组中接收 Json 数据。

//像这样修改你的代码

VAR URL = "API 调用此处"

request(url, function(error, response, body){

 if(!error && response.statusCode == 200){
    var data = JSON.parse(body);
    res.send(data);
    var MongoClient = require('mongodb').MongoClient;
    var url = "mongodb://localhost:27017/mydb";
    MongoClient.connect(url, function(err, db) {
      if (err) throw err;
      var myobj = [];
      myobj.push(data);
      db.collection("dabas").insertMany(myobj, function(err, res) {
        if (err) throw err;
        console.log("Number of documents inserted: " + res.insertedCount);
        db.close();
      });
    });
 }

});

你的问题是你传递 obj 而不是数组

/

/请参阅下面的链接供您参考

https://docs.mongodb.com/manual/reference/method/db.collection.insertMany/

最新更新