MongoDB插入音频

时间:2016-05-02 04:29:17

标签: mongodb audio

我已经通过javascript和php将包含文本的一百万个文档插入到mongodb数据库中。我想知道如何将与音频/图像相关的一百万个文档插入到数据库中。

我用于插入文字的脚本:

var minDate = new Date(2012, 0, 1, 0, 0, 0, 0);
var maxDate = new Date(2013, 0, 1, 0, 0, 0, 0);
var delta = maxDate.getTime() - minDate.getTime();

var job_id = arg2;

var documentNumber = arg1;
var batchNumber = 5 * 1000;

var job_name = 'Job#' + job_id
var start = new Date();

var batchDocuments = new Array();
var index = 0;

while(index < documentNumber) {
    var date = new Date(minDate.getTime() + Math.random() * delta);
    var value = Math.random();
    var document = {       
        created_on : date,
        value : value
    };
    batchDocuments[index % batchNumber] = document;
    if((index + 1) % batchNumber == 0) {
        db.randomData.insert(batchDocuments);
    }
    index++;
    if(index % 100000 == 0) {  
        print(job_name + ' inserted ' + index + ' documents.');
    }
}
print(job_name + ' inserted ' + documentNumber + ' in ' + (new Date() - start)/1000.0 + 's');

是否也可以使用类似的脚本来插入音频/图像?

感谢。

1 个答案:

答案 0 :(得分:0)

是的,但你需要一个强大的解释器才能实现这一目标。可以使用BinData将二进制数据插入MongoDB,BinData需要base64字符串,而cat()除了读取二进制数据失败外,不会将二进制文件转换为字符串。

快速解决方法可能是获取base64字符串,保存到文件,然后在脚本中使用cat()读取。 node.js中的示例:

var fs = require('fs');
var b64Str = fs.readFileSync('file.mp3','base64');
fs.writeFileSync('base64ContentFile',b64Str);

为要放入数据库的每个文件执行此操作,然后运行脚本更改以下内容:

var document = {
    created_on : date,
    value : new BinData(0,cat('base64ContentFile'))
};

更好的解决方案是使用另一种语言,mongodb驱动程序并在那里做所有事情。读取一个文件,将其解析为base64字符串,然后插入db,循环。

https://docs.mongodb.org/manual/reference/mongodb-extended-json/#binary