MongoDB v4.4 聚合的 $getField 的替代方案

问题描述 投票:0回答:1

我正在使用 Atlas App Services,它仅支持 MongoDB v4.4,并且不包含

$getField
作为聚合运算符。我需要访问表达式返回的对象的字段,并且感觉这在没有
$getField
的情况下也是可能的,但无法弄清楚语法。

简单来说,如果我有

<expression>
,有什么替代方案:

$getField: {
    field: "myFieldName",
    input: <expression>
}

文档暗示

$getField
仅适用于不常见的字段名称,以
.
$
开头。

我需要的用例的更完整示例如下,我希望将

isOwner
设置为布尔值:

// Part of a $set in an aggregation
{ "isOwner" : {"$in" : [
    userId,
    {$getField: {
        field: "ownerIds",
        input: { $arrayElemAt: [ "$tasks", {
            $indexOfArray: [
                { $map: { input: "$tasks", as: "task", in: "$$task._id" }},
                "$$myId"
            ]
        }]}

    }}
]}}

这里发生了一些事情,但我的主要问题是如何在没有

$getField
的情况下实现相同的目标。我也可能使内部部分过于复杂,通过匹配 Id 从一组tasks中提取特定的task - 也很高兴对此有任何评论!

mongodb aggregation-framework
1个回答
0
投票

没有“干净”的方法可以做到这一点,我使用的方法是将对象转换为数组,将其过滤为我想要的键,然后提取值,如下所示:

db.collection.aggregate([
  {
    $addFields: {
      "isOwner": {
        "$in": [
          userId,
          {
            "$arrayElemAt": [
              {
                $map: {
                  input: {
                    $filter: {
                      input: {
                        "$objectToArray": {
                          "$arrayElemAt": [
                            "$tasks",
                            {
                                $indexOfArray: [
                                    { $map: { input: "$tasks", as: "task", in: "$$task._id" }},
                                    "$$myId"
                                ]
                            }
                          ]
                        }
                      },
                      cond: {
                        $eq: [
                          "$$this.k",
                          "ownerIds"
                        ]
                      }
                    }
                  },
                  in: "$$this.v"
                }
              },
              0
            ]
          }
        ]
      }
    }
  }
])

蒙戈游乐场

© www.soinside.com 2019 - 2024. All rights reserved.