gpt4 book ai didi

javascript - Node.js/MongoDB/ Mongoose : Buffer Comparison

转载 作者:可可西里 更新时间:2023-11-01 09:11:34 25 4
gpt4 key购买 nike

首先,一点背景:

我正在尝试检查图像的二进制数据是否已保存在 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 Buffer 类型与 Node Buffer 的比较问题,但我不知道如何正确比较它们。请让我知道如何更新下面的内容!谢谢!

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 将要存储的 Buffer 元素转换为 mongodb Binary ,但它在进行查询时会执行适当的转换。units tests 中也检查了预期的行为(也是 node.js 缓冲区的存储和检索)。

您确定要传递 node.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');

关于javascript - Node.js/MongoDB/ Mongoose : Buffer Comparison,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18723977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com