MongoDB如何将字段设置为另一个字段的哈希值
问题
是否可以修改如下MongoDB查询,不再使用{$toString: "$_id"},而是获取文档中image字段值的哈希值,并用该哈希值拼接新的image字段值?
原查询代码:
db.getCollection("test_products").updateMany( {_id: {$in: [ ObjectId('6340eae3bb965cdee37b8b30'), ObjectId('6340eae3bb965cdee37b8b33') ]}}, [ { $set : { image : { $concat : [ "https://www.example.com/products/", { $toString: "$_id" }, ".png" ] } } } ] );
期望的查询逻辑类似:
db.getCollection("test_products").updateMany( {_id: {$in: [ ObjectId('6340eae3bb965cdee37b8b30'), ObjectId('6340eae3bb965cdee37b8b33') ]}}, [ { $set : { image : { $concat : [ "https://www.example.com/products/", { $hex_md5: "$image" }, ".png" ] } } } ] );
解答
可以实现这个需求,但需要注意MongoDB的哈希操作符用法:
- MongoDB中计算MD5哈希的正确操作符是
$md5,它会直接返回输入值的十六进制MD5字符串,不需要用$hex_md5。 - 由于你使用的是聚合管道式更新(update参数为数组),
$image引用的是更新前的原始字段值,完全符合你的需求。
修正后的正确查询代码:
db.getCollection("test_products").updateMany( {_id: {$in: [ ObjectId('6340eae3bb965cdee37b8b30'), ObjectId('6340eae3bb965cdee37b8b33') ]}}, [ { $set : { image : { $concat : [ "https://www.example.com/products/", { $md5: "$image" }, ".png" ] } } } ] );
额外注意事项:
- 如果目标文档中
image字段不存在,$md5会返回null,最终拼接出的路径会是https://www.example.com/products/null.png。如果要避免这种情况,可以在查询条件里加上{image: {$exists: true, $ne: ""}},只更新有有效image值的文档。 - 若要处理空字符串的情况,可以用
$ifNull兜底,比如:{$md5: {$ifNull: ["$image", "default_value"]}},防止哈希空值。
内容的提问来源于stack exchange,提问作者blizz
相关产品推荐
相关产品推荐

