【问题标题】:Custom functions calculated columns mongodb projection自定义函数计算列 mongodb 投影
【发布时间】:2015-07-24 22:14:03
【问题描述】:

我正在尝试使用投影来获取使用集合中列上的自定义函数计算的列,但我不知道如何做到这一点。我能做的是:

db.collection.aggregate([$project:{column1:1, calculatedCol: {$literal:[ jaro_Winkler("how to access column name")]}] )

代码可能有语法错误,因为我现在没有代码。

【问题讨论】:

  • 您是否尝试调用 JavaScript 代码来计算列值?您不能这样做,因为聚合管道不执行 Javascript。使用可用的聚合运算符。如果您无法解决,请编辑您的问题以显示您的“功能”是什么意思。
  • @Blackes Seven JavaScript 函数被聚合调用,但我找不到传递列名的方法。 JavaScript 函数与 jaro winkler 相似。

标签: mongodb


【解决方案1】:

您似乎认为可以在聚合管道中调用 JavaScript 函数,但您不能这样做。您误认为在管道中执行的函数结果中的变量实际上是“插值”。

例如,如果我这样做:

var getNumbers = function() { return [ 1,2,3 ] };

然后我称之为:

db.collection.aggregate([
    { "$project": {
        "mynums": getNumbers()
    }}  
])

然后在 JavaScript shell 中实际发生的情况是值被“插值”和“在”指令发送到服务器之前,如下所示:

db.collection.aggregate([
    { "$project": {
        "mynums": [1,2,3]
    }}  
])

为了进一步证明,在服务器上“仅”存储一个函数:

db.system.js.save({ "_id": "hello", "value": function() { return "hello" } })

然后尝试运行聚合语句:

db.collection.aggregate([
    { "$project": {
        "greeting": hello()
    }}  
])

这将导致异常:

E QUERY [main] ReferenceError: hello is not defined at (shell):1:69

这是因为执行发生在“客户端”而不是“服务器”上,并且该函数在客户端上不存在。

聚合框架不能运行 JavaScript,因为它没有这样做的规定。所有操作都在本机代码中执行,没有调用 JavaScript 引擎。因此,您可以使用那里的运算符:

db.collection.aggregate([
    { "$project": {
        "total": { "$add": [ 1, 2 ] },
        "field_total": { "$subtract": [ "$gross", "$tax" ] }
    }}  
])   

如果您无法使用运算符来获得结果,那么您可以运行 JavaScript 代码的唯一方法是运行 mapReduce,这当然使用 JavaScript 引擎与集合中的数据进行交互。如果需要,您还可以从那里引用逻辑中的服务器端函数:

{ "key": 1, "value": 1 },
{ "key": 1, "value": 2 },
{ "key": 1, "value": 3 }

db.system.js.save({ "_id": "square", "value": function(num) { return num * num } })

db.collection.mapReduce(
    function() {
        emit(this.key,square(this.value))
    },
    function(key,values) {
        return Array.sum(values);
    },
    { "out": { "inline": 1 } }
)

返回:

{
    "_id": 1,
    "value": 14
}

所以这不是关于“如何传递字段值”,而是关于聚合框架不以任何方式支持 JavaScript 的事实,并且您认为发生的事情实际上并非如此。

【讨论】:

  • 感谢您解释正在发生的事情的回复。您能否为我提供一个如何使用 map reduce 的示例,以便我可以将其标记为答案。
  • @ManarHusrieh 添加了一个简单的示例。
  • 为解释点赞
猜你喜欢
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-09
  • 2021-10-22
  • 1970-01-01
  • 2021-01-23
相关资源
最近更新 更多