我有一个 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/