customfield=10 else if(field1 =="B" )->customf-6ren">
gpt4 book ai didi

mongodb - 在 MongoDB 中是否有 elseif 东西到 $cond 聚合时

转载 作者:IT老高 更新时间:2023-10-28 13:08:01 25 4
gpt4 key购买 nike

所以我需要一个在 MongoDB 中计算的自定义字段,如下所示

if( field1 =="A")  ->customfield=10
else if(field1 =="B" )->customfield=20
else (field1 =="C" ) ->customfield=15

我将聚合与 $project 语句一起使用。但是 $cond 运算符不允许 elseif(子分支 else),只允许 if 和 else 两个静态分支。使用嵌套的 elseif 会导致

“异常:$expressions 中不允许包含字段”

这是我的查询(这给了我错误)

db.items.aggregate([ { $project :
{
name: 1,
customfield:
{
$cond: { if: { $eq: [ "$field1", "4" ] }, then: 30,
else: {
if:
{ $eq: ["$field1","8"]},
then: 25, else: 10}}
}
}},{ $sort: { customfield: 1 }},{$limit:12}]);

是否有解决此问题的方法或解决方法。如果这是一个重复的问题,但我找不到类似的问题,我深表歉意。

最佳答案

对于现代版本(自 MongoDB 3.4 起),您将使用 $switch ,这基本上是其他语言实现中的 switchcase 关键字的对应物:

db.items.aggregate([
{ "$project": {
"name": 1,
"customfield": {
"$switch": {
"branches": [
{ "case": { "$eq": [ "$field1", "4" ] }, "then": 30 },
{ "case": { "$eq": [ "$field1", "8" ] }, "then": 25 }
],
"default": 10
}
}
}},
{ "$sort": { customfield: 1 }},
{ "$limit":12 }
])

这避免了嵌套 if..then..else 条件,可以使用$cond 来完成。如下所示。但是下面仍然作为示例显示,这始终可以完成,甚至在显式 if..then..else 关键字的 new 运算符之前,因为原始数组表示法始终保持该语法。

还要注意,这里的条件 数组 通常也比为 $cond 所需的语句创建 嵌套 数据结构更容易以编程方式构造。 .


if..then..else 关键字到 $cond在撰写本文时,运算符只是最新版本的 MongoDB 的最新添加(MongoDB 2.6 引入了 keywords。实际的运算符可在 MongoDB 2.2 中发布聚合框架时使用)。目的是为了清楚起见,但在这种情况下,它似乎引起了一些困惑。

作为 if..then.else 运算符 $cond确实是ternary运算符,就像在许多编程语言中实现的一样。这意味着作为“内联”条件,而不是为条件创建逻辑“ block ”,任何不满足第一个条件的东西都属于 else

因此你“嵌套”语句而不是跟随 block :

db.items.aggregate([
{ "$project": {
"name": 1,
"customfield": {
"$cond": {
"if": { "$eq": [ "$field1", "4" ] },
"then": 30,
"else": {
"$cond": {
"if": { "$eq": ["$field1","8"]},
"then": 25,
"else": 10
}
}
}
}
}},
{ "$sort": { customfield: 1 }},
{ "$limit":12 }
]);

或者甚至使用原始的 array 表示法,如果以编程方式构建语句,有些人可能更喜欢这种表示法:

db.items.aggregate([
{ "$project": {
"name": 1,
"customfield": {
"$cond": [
{ "$eq": [ "$field1", "4" ] },
30,
{ "$cond": [
{ "$eq": ["$field1","8"] },
25,
10
]}
]
}
}},
{ "$sort": { customfield: 1 }},
{ "$limit":12 }
]);

三元意味着三个条件,不多不少。所以所有的if..then..else逻辑都必须嵌套。

关于mongodb - 在 MongoDB 中是否有 elseif 东西到 $cond 聚合时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27479347/

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