如何上传大数据到mongodb

y53ybaqx  于 2023-02-11  发布在  Go
关注(0)|答案(1)|浏览(122)

我需要上传大量的数据到mongodb。
不是文件,而是大量的键值对。
示例:

let payload = [];
                  
for ( let i =0 ;i<1000000;i++){
    payload.push({ 
           "first name": "juan",
           "hair color": ""+i,
           "gender" :"male"
          })
}

var body = {
    "channelId":"63dd281360e269e2a9399939",
    "recordCount":payload.length,
    "minBidUSD": 5,
    "payload": payload
}

上面的脚本创建了一个巨大的有效负载。2这个有效负载然后被放在POST请求的主体中。
我需要能够在有效载荷中存储大量数据。
功能背景:我在一个网站上工作,人们可以出售数据线索.例如:我正在寻找男性在佛罗里达州是30岁。可能的数据结构为铅有效载荷将是:

{gender:"male",state:"florida",age:30}

这是有如下问题:
[1]是否有更好的方法来存储这些数据?--注:这个负载的属性改变了,所以我不能创建一个模型来对抗它。
[2]如果存储这些数据的最佳方法是使用gridfs-file-storage,我该怎么做呢?
关于该问题的其他说明:
下面是保存有效负载的集合的模型

const mongoose = require("mongoose");
const channelDataSchema = mongoose.Schema({
channelId: { type: String, required: true },
payload: { type: [Object], required:true },
});
module.exports = mongoose.model("ChannelData", channelDataSchema);
yhqotfr8

yhqotfr81#

Gridfs是用于二进制数据的,并且被分块以避免16 mb的MongoDB文档大小限制。我不推荐gridfs用于基本数据。
为了快速获取数据,我建议使用批量写入。下面是一个mongoshell示例。这个示例将循环创建一组使用random()函数组成的假数据元素。它仅用于说明。如果您需要从源(如文件)或另一个数据库系统插入数据,则可以使用自定义编程语言(如Node)使用批量写入。并使用MongoDB支持的数据库驱动程序-其中包括批量写入特性。

MongoShell示例:

use mydatabase;

function getRandomInteger(min, max) {
    // NOT INCLUSIVE OF MAX.  IF NEED TO INCLUDE MAX, BUMP IT UP BY ONE
    return Math.floor(Math.random() * (max - min) + min);
} 

function getRandomAlphaNumeric(length) {
  var result = [];
  var characters = 'abcdefghijklmnopqrstuvwxwyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  var charactersLength = characters.length;

  for ( var i = 0; i < length; i++ ) {
    result.push(characters.charAt(Math.floor(Math.random() * charactersLength)));
  }

  return result.join('');
}

function generateDocument() {
  return {
    stringFixedLength01: getRandomAlphaNumeric(1),
    stringFixedLength02: getRandomAlphaNumeric(2),
    stringFixedLength03: getRandomAlphaNumeric(3),
    stringFixedLength04: getRandomAlphaNumeric(4),
    stringFixedLength05: getRandomAlphaNumeric(5),
    stringVariableLength: getRandomAlphaNumeric(getRandomInteger(5, 50)),
    integer1: NumberInt(getRandomInteger(0, 2000000)),
    long1: NumberLong(getRandomInteger(0, 100000000)),
    date1: new Date(),
    guid1: new UUID()
  };
}


for (var j = 0; j < 1000000; j++) {
  var batch=[];

  for (var i = 0; i < 50000; i++) {
    batch.push( { insertOne: { document: generateDocument() } } );
    if(i % 10000 == 0) {
        print("outerloop: " + j + ", innerloop: " + i);
    }
  }
  
  print("BulkWrite command submitted...");
  db.mycollection.bulkWrite(batch, {ordered: false});
}

相关问题