【问题标题】:Out of Memory Error saving lots of documents with Mongoose in NodeJs在 NodeJs 中使用 Mongoose 保存大量文档时出现内存不足错误
【发布时间】:2016-02-24 21:38:48
【问题描述】:

我有以下代码可以找到任何缺少 DateUTC 的文档,并使用文档中包含的日期字符串值循环并设置日期。数据通过 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);
    });

【问题讨论】:

  • array[i].header.refTime 的类型是什么?如果已经是日期,则无需获取所有文档来逐一更新。

标签: json node.js mongodb mongoose


【解决方案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 函数。

【讨论】:

猜你喜欢
  • 2021-04-23
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 2014-05-10
  • 2015-06-14
  • 2013-12-16
  • 2012-05-15
  • 1970-01-01
相关资源
最近更新 更多