Node.js / MongoDB / Mongoose:缓冲区比较
Node.js / MongoDB / Mongoose: Buffer Comparison
首先,一点背景:
我正在尝试检查图像的二进制数据是否已保存在Mongo中。 给定以下架构:
var mongoose = require('mongoose')
, Schema = mongoose.Schema;
var imageSchema = new Schema({
mime: String,
bin: { type: Buffer, index: { unique: true }},
uses : [{type: Schema.Types.ObjectId}]
});
module.exports = mongoose.model('Image', imageSchema);
。我想查询图像是否存在,它是否确实添加了我的对象正在使用它的引用,然后更新它。 如果没有,我想创建(更新)它。
鉴于它不存在,下面的代码可以完美运行。 如果是这样,下面的代码不会,并将另一个图像文档添加到 Mongo。 我觉得这可能是Mongo缓冲区类型与节点缓冲区的比较问题,但是我不知道如何正确比较它们。 请让我知道如何更新以下内容! 谢谢!
Image.findOneAndUpdate({
mime : contentType,
bin : image
}, {
$pushAll : {
uses : [ myObject._id ]
}
}, {
upsert : true
}, function(err, image) {
if (err)
console.log(err);
// !!!image is created always, never updated!!!
});
Mongoose 将要存储的缓冲区元素转换为 mongodb 二进制,但它在执行查询时执行适当的强制转换。在单元测试(也是节点的存储和检索.js缓冲区)中也会检查预期的行为。
您确定要传递节点.js缓冲区吗?
无论如何,我认为处理初始问题(检查图像是否已在数据库中)的最佳方法是存储二进制数据的强哈希摘要(sha1,sha256,...)并检查(使用加密模块)。查询时,作为初步测试,您还可以检查二进制长度以避免不必要的计算。
有关如何在存储/查询图像之前获取图像摘要的示例:
var crypto = require('crypto');
...
// be sure image is a node.js Buffer
var image_digest = crypto.createHash('sha256');
image_digest.update(image);
image_digest = image_digest.digest('base64');
按节点查询图像不是一个好主意.js 包含图像数据的缓冲区。您说得对,这可能是 BSON 二进制数据类型和节点缓冲区之间的问题,但您的应用程序真的需要这样的比较吗?
相反,我会将 imageID 或 slug 字段添加到您的架构中,向该字段添加索引,并对其进行查询,而不是在您的findOneAndUpdate
调用中bin
:
var imageSchema = new Schema({
imageID: { type: String, index: { unique: true }},
mime: String,
bin: Buffer,
uses : [{type: Schema.Types.ObjectId}]
});
确实有效,我使用的另一个过滤器是图像的exif数据。由于这是结构化信息,如果您在 exif 数据上匹配,则可以转到下一步,检查哈希或文件大小是否匹配......
成堆的节点模块,为您的存储:)轻松获取 EXIF 数据获取节点的 EXIF 数据的示例代码
- 比较从函数和生成的日期对象
- 如何使用 node.js 比较两个 json 数组
- jQuery自定义验证比较多个输入的序列
- 反向字符串比较
- 通过JSON&比较时间
- 将DOM节点值与字符串Javascript进行比较
- 从键值结构中获取数据,并将其与AngularJS中ng重复的值进行比较
- 递归深度比较
- 可以't在JavaScript中比较两个字符串
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- 如何在moment.js中只比较日期
- 无法比较javascript变量
- 比较javascript中的浮动并更改最高浮动的颜色
- 使用javascript比较对象中的对象值和数组长度
- 如何将smarty变量与javascript变量进行比较
- 比较两个数组中的元素
- 比较:用缓冲区视图调整ArrayBuffer的大小(Uint8 vs Float64),我是不是遗漏了什么
- Node.js / MongoDB / Mongoose:缓冲区比较
- 比较NodeJS缓冲区,同时避免定时攻击
- 如何将utf-16缓冲区与字符串进行比较