内存不足错误在NodeJs中使用Mongoose保存大量文档

时间:2016-02-24 13:01:00

标签: json node.js mongodb mongoose

我有以下代码,找到缺少DateUTC的任何文档并循环并使用文档中包含的datestring值设置日期。数据通过JSON文件导入,因此日期需要转换为UTC日期。然而,当有> 1000条记录时,我正在“处理内存不足”。这些文件是相当大的JSON天气读数。我是MongoDb和Node的新手,但这不是很多要更新的数据,所以我觉得我做错了。

'use strict';
var mongoose = require('mongoose');
var Schema = mongoose.Schema;    
var db = mongoose.connection;
var Grib = require('./models/grib.js');
var fs = require('fs');
var moment = require('moment');

//register call back events

db.on('error', console.error);
db.once('open', function () {

    //do our DB work here
    var today = moment().startOf('day');
    var tomorrow = moment(today).add(1, 'day');
    var yesterday = moment(today).add(-1, 'day');

    Grib.find({ 'header.dateUTC': null }, {}, {}, function (err, array) {
        for (var i = 0, len = array.length; i < len; i++) {
            array[i].header.dateUTC = moment.utc(array[i].header.refTime).toDate();
            array[i].save(function (err) {
                if (err) console.log('save error:' + err);
            });

        };
        console.log('Number of grib dates updated:' + array.length);
    });

1 个答案:

答案 0 :(得分:1)

您可以随时分页。例如,按1000批量提取,请记住,您必须对对象进行排序才能使其正常工作。

var index = 0;
Grib.find({ 'header.dateUTC': null }).sort('created_at').skip(index).limit(1000).exec(function (err, array) {
        index += 1000;
.
.
.

了解nodejs异步性质。我建议你看一下async each 函数。