我是新加入MongoDB的.我正try 在$PROJECT阶段使用计算字段来解析其他字段.

我给你看一个简化的例子.

input

    [
  {
    a: 5,
    b: 3
  },
  {
    a: 2,
    b: 1
  },
  
]

Code

db.collection.aggregate([
  {
    $project: {
      _id: 0,
      c: {
        "$add": [
          "$a",
          "$b"
        ]
      },
      d: {
        "$multiply": [
          "$a",
          "$c"
        ]
      }
    }
  }
])

Output

[
  {
    "c": 8,
    "d": null
  },
  {
    "c": 3,
    "d": null
  }
]

result

我只得到空值,我已经try 使用$let来解决它,但没有结果. 解决它的一个简单方法是复制$Add操作,但如果它是一个复杂的计算,就像我在实际项目中处理的那样,而且它被复制了很多次,就像这种情况一样,它可能正在执行不必要的操作.

Help to me please

sample playgrond

推荐答案

db.collection.aggregate([
{
"$project": {
  "test": {
    "$let": {
      "vars": {
        "sum": {
          $add: [
            "$a",
            "$b"
          ]
        },
        "d": 3
      },
      "in": {
        "c": "$$sum",
        "d": {
          "$multiply": [
            "$$sum",
            "$b"
          ]
        }
      }
     }
    }
   }
  }
])

解释:

通过$let设置和,并在以后将其用作计算乘法的变量.

Playground

Mongodb相关问答推荐

在MongoDB中,如何使用$in来匹配存储在数组变量中的值

如何在Mongo中制作全覆盖索引

MongoDB - 将数组元素转换为新字段

如何更新mongo中列表最后一个对象的属性

在推入 mongodb 时自动填充 golang struct 中的 created_at 和 updated_at

MongoDB 存储大量指标/分析数据的方法

使用 Node.js 通过 SSL 连接到 MongoDB

当属性确实存在时,为什么mongoose模型的 hasOwnProperty 返回 false?

如何使用python将csv数据推送到mongodb

查找对象是否在预保存钩子mongoose中更改

将 MongoDB 地理空间索引与 3d 数据结合使用

为什么 local.oplog.rs 上每隔几分钟的活动就会锁定 mongo 客户端

MongoDB 1.6.5:如何重命名集合中的字段

将 mongoose 字符串模式类型默认值设为空白并使该字段可选

MongoDB 中的所有列

在 mongoose 中使用 UUID 进行 ObjectID 引用

错误:需要数据和盐参数

MongoDB 用 $type 匹配一个数组?

何时使用Singleton单例、Transient和使用 Ninject 和 MongoDB 的请求

MongoDB Compass:select distinct field values