gpt4 book ai didi

mongodb - 自定义函数计算列 mongodb 投影

转载 作者:可可西里 更新时间:2023-11-01 09:56:24 24 4
gpt4 key购买 nike

我正在尝试使用投影来获取使用集合中列上的自定义函数计算的列,但我想不出如何去做。我能做的是:

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

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

最佳答案

您似乎认为可以在聚合管道中调用 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,因为它没有这样做的规定。所有操作均以 native 代码执行,不调用任何 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 的事实,而且您认为发生的情况实际上并非如此。

关于mongodb - 自定义函数计算列 mongodb 投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31620582/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com