mongodb - 如何在 MongoDB 中使用计算字段进行数学计算?

标签 mongodb mongodb-php

我有一个 mongo 聚合查询,它使用 $project: 创建了一些计算字段。我发现计算字段无法用于 mongo shell 的进一步计算,因为它开始提示无法将字符串转换为数字。

有解决办法吗?该查询在不使用计算字段的情况下工作,但它要求我为我想要执行的每个数学运算重新计算所有内容,从而极大地减慢了查询速度。

更新:

以下查询返回此错误:

"errmsg" : "exception: $mod only supports numeric types, not String and NumberDouble",
"code" : 16611,
"ok" : 0

诚然,查询示例在其用例中是无意义的,但对其执行数学运算的期望是相同的:

db.books.aggregate([
{$project:  {
    'priceToInflationRatio': {$multiply: [{'$divide': [{'$subtract': ['$price', 1]}, 5]}, 10]},                                                    
    'priceInflationresult':
        {'$cond': [
                {'$gt': ['$price', 5]},
                    {'$mod': [
                        'priceToInflationRatio',
                        1]},
                1
        ]},
}}
])

如果我使用:

                    {'$mod': [
                        '$priceToInflationRatio',
                        1]},

计算结果始终为空。

更新 2 - 可能的解决方案:

我可能偶然发现了解决方案:使用 2 个不同的 $project 部分。似乎如果我引用在同一 $project 部分中创建的字段,它还不知道。因此,我需要在一个部分中创建所有计算字段,然后在另一部分中引用它们。

以下似乎有效:

db.books.aggregate([
{$project:  {
    'priceToInflationRatio': {$multiply: [{'$divide': [{'$subtract': ['$price', 1]}, 5]}, 10]}
}},
{$project: {
    'priceInflationresult':
        {'$cond': [
                {'$gt': ['$price', 5]},
                    {'$mod': [
                        '$priceToInflationRatio',
                        1]},
                1
        ]},
}}
])

这个假设是否正确,这是正确的做法吗? (我很难从 SQL 学习如何在 Mongo 中构造查询,所以请耐心等待。)

最佳答案

这行得通,但您可以使用 $let 稍微清理一下将 priceToInflationRatio 定义为 $project 中的一个变量,这样您就可以只使用一个阶段:

db.books.aggregate([
  {$project: {
    'priceInflationresult': {
      $let: {
        vars: {
          'priceToInflationRatio': {
            $multiply: [{'$divide': [{'$subtract': ['$price', 1]}, 5]}, 10]
          }
        },
        in: {
          '$cond': [
            {'$gt': ['$price', 5]},
            {'$mod': ['$$priceToInflationRatio', 1]},
            1
          ]
        },
      }
    }
  }}
])

关于mongodb - 如何在 MongoDB 中使用计算字段进行数学计算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25044521/

相关文章:

php - 找不到类 'MongoId'(Zend Framework with MongoDB Doctrine)

node.js - mongoose 能阻止所有 NoSQL 攻击吗?

postgresql - PostgreSQL 的扩展性与 MongoDB 相比如何?

php mongodb 聚合(断言 13111 错误)

php - 在 MongoDB PHP 驱动程序中使用数字字段名称

php - MongoDB PHP - 限制和跳过不起作用

php - MongoDB - 是否可以通过关联数组键查询?

node.js - Mongoose:如果发生错误,我可以对我的数据做出什么假设

node.js - 使用 mongoose 对子子文档进行 CRUD

Mongodb findAndModify 每个文档