【问题标题】:MongoDB Aggregate Variable to create Multiple Fields?MongoDB聚合变量创建多个字段?
【发布时间】:2014-07-30 21:28:11
【问题描述】:

鉴于以下查询,使用 $$priceToInflationRatio 帮助创建多个计算字段的最佳方法是什么?根据我在 $let 上阅读的内容,它似乎只适用于创建单个字段——我想在整个 $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-php


    【解决方案1】:

    $let 表达式的 in 部分是一个对象,因此它可以接受多个键,每个键都可以是使用范围内的变量计算的表达式:

    > db.test.insert({ "_id" : 0, "a" : 1, "b" : 1 })
    > db.test.aggregate([{
        "$project" : {
            "test" : {
                "$let" : {
                    "vars" : {
                        "c" : 2,
                        "d" : 3
                    },
                    "in": {
                        "a" : { "$add" : ["$a", "$$c"] },
                        "b" : { "$add" : ["$b", "$$d"] }
                    }
                }
            }
        }
    }]);
    { "_id" : 0, "test" : { "a" : 3, "b" : 4 } }
    

    请注意,这必然会创建子文档,因为不允许使用顶级 $let 表达式。您可以使用另一个 $project 阶段来更改它。

    【讨论】:

    • 谢谢你的例子。我现在已经使用了多个 $project 阶段来解决它。希望有顶级的 $let 或类似的东西。考虑子文档解决方案也很有趣,我没有想到这一点。这样我就可以在后续的 $let 中引用新创建的子文档。多个 $lets 或 $project 的性能是否大致相当,或者一个比另一个有优势?
    • 我不能说性能方面。两者都应该很快。最好的指南必须是您自己的测试,但我猜差异足够小,使用更容易维护的任何一种方式可能是最好的。
    猜你喜欢
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 2021-02-28
    • 2018-04-05
    • 1970-01-01
    相关资源
    最近更新 更多