我有一个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中构建查询,所以请耐心等待。)
答案 0 :(得分:3)
虽然有效,但您可以使用$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
]
},
}
}
}}
])