当前位置: 首页 > 知识库问答 >
问题:

mongodb实现模板的计算字段,如何实现,有什么好的思路希望得到指点?

罗晨
2023-09-26

模板配置中,需要添加一个计算字段,数据库是mongodb,不知道有什么好的设计方案

计算字段 = $字段1$ * $字段2$ + 233

如何将这个表达式转换成mongodb的语法,或者使用其他方式处理呢(其实里面还可能存在变量时间,函数等先不做讨论)。
目前的思路和想法是,将模板字段保存后加到配置表,每次查询时将字段使用addFields查询出来

共有2个答案

施令雪
2023-09-26

参考逆波兰表示法和调度场算法,可以实现需求

魏彦
2023-09-26

在 MongoDB 中,你可以使用聚合管道和 $expr 操作符来计算这样的计算字段。在你的案例中,你可以将计算字段的表达式保存在数据库中,然后在查询时使用聚合管道来计算这个字段。

首先,你需要将你的计算字段表达式保存到数据库中,可以作为一个新的字段。比如你可能会保存以下的文档:

{  "_id": "your_id",  "field1": ...,  "field2": ...,  "computedFieldExpression": "field1 * field2 + 233"}

然后,你可以使用 $expr 操作符在聚合管道中计算这个字段。比如,你可以使用以下的聚合管道来添加一个新的计算字段:

db.collection.aggregate([  {    $project: {      _id: 1,      computedField: { $expr: "$computedFieldExpression" }    }  }])

在这个例子中,$expr 操作符会计算字段 computedFieldExpression 的值,并将结果赋给新的字段 computedField

需要注意的是,这种方法有一个限制,那就是你不能在 $expr 中直接使用保存的函数或变量。如果你需要在查询中使用函数或变量,你可能需要保存计算的完整逻辑,比如你可以保存一个 JSON 字符串,包含计算逻辑,然后在查询时解析这个 JSON 字符串并执行计算逻辑。

如果你有更复杂的需求(例如,需要使用函数或变量),那么你可能需要考虑使用 MongoDB 的 MapReduce 功能,或者使用第三方的文档存储库,比如 Elasticsearch,它提供了更完整的计算字段功能。

 类似资料:
  • NutAop清晰简洁地实现了Aop中最常用,最常见的需求--控制特定方法的执行逻辑 了解这个模型,能够更好地理解Aop 基本思路 原方法(没有返回值) public void exe(){ //Do something } 被改造后 import org.nutz.aop.InterceptorChain; .... public void exe(){ try{

  • 如图,不采用div一个个格子画的话,有没有什么优雅的实现方式

  • 问题内容: 我项目的一位主要开发人员已将项目的toString()实现称为“纯粹的残障”,并希望将其从代码库中删除。 我已经说过,这样做意味着任何希望显示对象的客户端都必须编写自己的代码以将对象转换为字符串,但这得到了“是的答案”。 现在具体来说,该系统中的对象是矩形,圆形等图形元素,当前表示形式是显示x,y,比例,边界等。 那么,人群在哪里呢? 您应该何时以及何时不应该实现toString? 问

  • 我想要一个方法,用于、和,因此我创建了一个trait: 我得到一个错误: 根据Rust标准库文档,未实现。为什么存在冲突的实现?

  • 问题内容: 我知道快速排序算法,但是我只关心合并排序算法。 我在互联网上发现了两种类型的合并排序算法实现。但是,当我将它们与插入算法进行比较时,它们的效率似乎较低,并且对于大量项目而言,这并不是预期的。 还有另一种方法来实现合并排序算法,使其比插入算法更有效吗? 看一下我的代码… -—和------ 问题答案: 对工作/临时数组进行一次分配,并避免在合并期间复制数据(除非将一个剩余的运行从一个数组

  • 本文向大家介绍前端路由指的是什么?它有什么好处?它有哪些方式可以实现呢?相关面试题,主要包含被问及前端路由指的是什么?它有什么好处?它有哪些方式可以实现呢?时的应答技巧和注意事项,需要的朋友参考一下 spa(单页)应用 本质就是根据url变化动态切换组件展示 有hash和histrory 模式 url组成部分中 '#' 号 开始的内容称为hash值,以前是用来做页面滚动锚点的 浏览器提供了 win