抽象
将图像数据存储为base64编码的字符串可以正常工作,但是当查看Mongo中的内容时,我保存的原始字符串只是结尾持久字符串的前半部分。因为这个查询不起作用。
详情
考虑以下架构:
var mongoose = require('mongoose')
, Schema = mongoose.Schema;
var imageSchema = new Schema({
mime: String,
bin: String,
uses : [{type: Schema.Types.ObjectId}]
});
module.exports = mongoose.model('Image', imageSchema);
在bin
字段中,我正在存储base64图像数据。所以这个字符串可能很大(但是当它只有大约40k时,这个测试失败了。)
更新
我已经做了进一步的分析,这个更新的测试块显示了我看到的更好的结果:
var buffer = getImageFromFileSystem();
var bin = buffer.toString('base64');
var i = new Image({
mime : 'image/jpeg',
bin : bin
});
i.save(function(err, image){
if (err)
console.log(err);
console.log("=== original? "+(image.bin === bin)); //outputs true
console.log("now find it by id and then compare again")
Image.findOne({
_id : image._id
}, function(err, img) {
if (err)
console.log('crap error');
if (img) {
console.log('found one!: '+img.id+', lets compare... ');
console.log("===? "+(img.bin === bin)); //outputs true again!
}
});
//OK so clearly all is well, so let search by the bin str
Image.findOne({
bin : bin
}, function(err, img) {
if (err)
console.log('crap error');
if (!img) {
console.log("none found") // we hit this... what the heck???
});
所以我决定以bin
值查看数据库。 这里是我看到它的值是我保存的原始bin
字符串,加上至少两倍的字符附加到它的末尾。所以我的原始base64字符串是存储在MongoDB中的值的开头的子字符串。因此,当我findOne({bin:myBinValue})
时,这不起作用,因为比较是在Mongo内完成的。但是,如果我从Mongo中检索bin
值然后进行比较,它似乎会修剪回我的原始值,然后在我的应用程序中javasript比较是相同的!是什么赋予了!?我在这个领域没有索引。
> db.images.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"ns" : "mydb.images",
"name" : "_id_"
}
]