【问题标题】:Import data from file.json with mongoose使用 mongoose 从 file.json 导入数据
【发布时间】:2018-01-12 04:23:18
【问题描述】:

我需要使用 mongoose 从许多 json 文件中导入数据,但我似乎找不到方法。 现在我只是使用 mongoDB 命令导入文件:

mongoimport --db dbName --collection collectionName --file fileName.json --jsonArray

有没有办法用猫鼬做到这一点?这是用猫鼬做的正确方法吗(我正在使用expressJs)?如果不是,用 json 文件中的数据填充我的数据库的正确方法是什么?

这是我迄今为止在 server.js 中所做的

/ Set up
var express = require('express');
var app = express(); // create our app w/ express
var mongoose = require('mongoose'); // mongoose for mongodb
var ObjectId = require('mongodb').ObjectID; // objectID
var morgan = require('morgan'); // log requests to the console (express4)
var bodyParser = require('body-parser'); // pull information from HTML POST (express4)
var methodOverride = require('method-override'); // simulate DELETE and PUT (express4)
var cors = require('cors');

// Configuration
mongoose.connect('mongodb://localhost/data');

app.use(morgan('dev')); // log every request to the console
app.use(bodyParser.urlencoded({ 'extended': 'true' })); // parse application/x-www-form-urlencoded
app.use(bodyParser.json()); // parse application/json
app.use(bodyParser.json({ type: 'application/vnd.api+json' })); // parse application/vnd.api+json as json
app.use(methodOverride());
app.use(cors());

app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header('Access-Control-Allow-Methods', 'DELETE, PUT');
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
});

// Models
var Review = mongoose.model('Review', {
    title: String,
    description: String,
    rating: Number
});
var Site = mongoose.model('Site', {
    title: String,
    description: String,
    rating: Number
});

// Routes

// Get reviews
app.get('/api/reviews', function(req, res) {

    console.log("fetching reviews");

    // use mongoose to get all reviews in the database
    Review.find(function(err, reviews) {

        // if there is an error retrieving, send the error. nothing after res.send(err) will execute
        if (err)
            res.send(err)

        res.json(reviews); // return all reviews in JSON format
    });
});

【问题讨论】:

  • 只需在你的 shell 脚本中创建一个循环。当已经存在执行该功能的工具时,自己编写一些东西来从 JSON 源中解析和插入是一种冗余。这不是一项过于艰巨的任务,但除非您实际上已经做了很多次,否则很难“正确地做”。你也不太可能击败表演。 mongoimport 和其他工具是使用 Go 在相当低的水平上编写的,并且在他们所做的事情上毫不逊色。
  • 我明白了,所以没有别的办法。谢谢你。你能把这个写成答案,这样我就可以关闭这篇文章了吗?
  • 并不是说“没有别的办法”。去写一个已经存在的程序根本不“值得花时间”,而且实际上会比你可能写的任何东西做得更好。所以这只是一个合乎逻辑的选择。
  • 好吧,我会保持打开状态,以防出现更好的解决方案。

标签: json node.js mongodb express mongoose


【解决方案1】:

我遇到了同样的问题,使用 mongoimport 会绕过架构并使架构类型检查和验证无用。所以,我所做的对于单个 json 对象来说效果很好。我计划将其扩展为适用于整个 json 文件。所以,我有一个 POST 请求,它通过模式将数据添加到 mongoDB。我制作了一个 curl 脚本来发出相同的发布请求,并且确实通过了架构。这是我的 curl 脚本。

curl \
--header "Content-type: application/json" \
--request POST \
--data @data.json \
http://localhost:3000/supplierList

我在 data.json 文件中有一个 json 对象。这是它的样子。

{
    "supplierName": "KINGCOBRA",
    "price": "12345678911234567.00000000000000001",
    "basicDate": "2045/03/23",
    "currency": "USD",
    "partName": "ASDF",
    "description": "First Object: TEST 1: POST Inserting an array of object through the script",
    "volume": 2334
}

这种方法的唯一问题是它不支持插入 json 数组。但它适用于单个对象,无论其大小。让我知道是否有人找到了解决方法。

【讨论】:

  • 一个好的开始,我们现在只需要找到一个json数组的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2016-02-16
  • 2019-02-23
  • 2018-11-06
  • 1970-01-01
  • 2012-02-12
相关资源
最近更新 更多