当前位置:首页 > AI技术 > 正文内容

前端开发 MongoDB优惠活动规则配置怎么存 表达式与条件树内嵌|Duuu笔记

admin6天前AI技术16

嵌套文档更合理:单活动专属规则直接存 promotions 文档的 rules 字段;跨活动共享规则则拆至 promo_rules 集合,用 rule_id 引用并加 version 灰度控制。

优惠规则用嵌套文档还是单独集合

直接存嵌套文档更合理,尤其当规则和商品/活动生命周期强绑定时。MongoDB 的

document

天然支持树形结构,把条件树塞进

conditions

字段里,查活动时一并取出,避免多次查询或 $lookup 关联。

但要注意:如果同一套规则被上百个活动复用,或者规则本身频繁更新、需独立审计,那就该拆到

promo_rules

集合里,用

rule_id

引用——否则每次改规则都要批量更新所有活动文档,容易写冲突或漏更新。

单活动专属规则 → 嵌套在

promotions

文档的

rules

字段里

跨活动共享规则 → 单独集合 + ObjectId 引用,加

version

字段做灰度控制

规则字段名别叫

expression

(易误解为字符串脚本),用

condition_tree

更准确

条件树结构怎么设计才方便执行和调试

别用纯字符串存表达式(比如

"price > 100 && user.level >= 2"

),执行靠 JS

eval

或服务端解析,既慢又不安全。应该用可序列化的结构描述逻辑关系:

{

"type": "AND",

"children": [

{

"type": "GT",

"field": "order_amount",

"value": 100

},

{

"type": "IN",

"field": "user.tags",

"value": ["vip", "gold"]

}

]

}

这种结构能直接映射成后端 if 判断链,也方便前端可视化编辑器渲染节点。注意几个坑:

field

路径要统一用点号分隔(如

"user.profile.age"

),避免数组下标(

"items.0.name"

)导致匹配歧义

叶子节点的

value

类型必须明确:数字就存 Number,字符串带引号,布尔值用

true

/

false

,别混成字符串

"true"

如果支持“当前时间比较”,字段名别硬写

"now"

,用占位符

"$NOW"

,执行时再替换,防止序列化时出错

表达式里引用动态上下文字段怎么安全取值

规则执行时需要读订单、用户、商品等上下文数据,但不能让表达式任意访问对象属性(比如

user.__proto__.constructor.eval(...)

)。推荐两种方式:

白瓜AI

白瓜AI,一个免费图文AI创作工具,支持 AI 仿写,图文生成,敏感词检测,图片去水印等等。

下载

白名单字段投影:执行前只把允许访问的字段扁平化注入一个干净对象,如

{ order_amount: 199, user_level: 3, sku_category: "electronics" }

,表达式只能读这些 key

沙箱函数封装:用

get("user.level")

ctx("order.items.0.price")

这类受限访问函数,内部做路径校验和类型兜底,不暴露原始对象

绝对不要在 MongoDB 查询里用

$where

执行用户传入的 JS 表达式——它会全库扫描、无法索引,且有执行任意代码风险

性能和索引怎么配合条件树生效

条件树本身没法建索引,但高频过滤字段可以单独拎出来冗余存储。比如一个满减规则常看

order_amount

user.tier

,就在活动文档里加两个字段:

min_order_amount: 100

required_user_tier: "gold"

,然后对它们建复合索引:

db.promotions.createIndex({ "min_order_amount": 1, "required_user_tier": 1, "status": 1 })

这样查“当前可用的满减活动”时先走索引快速筛选,再对结果集逐个执行完整条件树判断。容易忽略的是:如果条件树里有

IN

REGEX

这类低效操作,得在应用层加缓存或预计算,MongoDB 本身扛不住实时遍历。

树越深、节点越多,执行耗时越不可控;线上建议限制最大深度为 4,单节点条件数不超过 8,超出就报错提示运营配置异常。

相关文章

【深度学习】Java DL4J 2024年度技术总结

一、Java DL4J深度学习概述 1.1 DL4J框架简介 1.2 与其他深度学习框架的比较 1.3 DL4J 的优势 1.3.1 与 Java 生态系统的无...

【大模型应用开发

二、大模型的泛化与微调 模型的泛化能力:是指一个模型在面对新的、未见过的数据时,能够正确理解和预测这些数据的能力。在机器学习和人工智能领域,模型的泛化能力是评估模型性能的重要指标之一。...

什么是LLM?看这一篇就够了!

一、全套AGI大模型学习路线 AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能! 二、640套AI大模型报告合集 这套包含640份报告的合集,涵盖了AI大...

LLM介绍

。LLM 被证明在使用指令形式化描述的未见过的任务上表现良好。这意味着 LLM 能够根据任务指令执行任务,而无需事先见过具体示例,展示了其强大的泛化能力。 :小型语言模型通常难以解决涉...

神经网络中的单层神经网络

神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术。人脑中的神经网络是一个非常复杂的组织。成人的大脑中估计有1000亿个神经元之多。 看一个经典的神经网络。这是一个包...

跨平台机器学习:ML.NET架构及应用编程

平台上的一个机器学习框架,它提供了一套丰富的算法和工具,使得开发人员可以轻松地构建和部署机器学习模型。支持多种编程语言,包括等,这使得它成为跨平台机器学习的理想选择。的架构主要包括三个部分:数据读取、...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。