我正在使用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的内部部分变得过于复杂--所以也很高兴有任何关于这方面的 comments !

推荐答案

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

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
            ]
          }
        ]
      }
    }
  }
])

Mongo Playground

Mongodb相关问答推荐

Mongodb如果数组中有外部键,则将排序应用到查找结果

如何在MongoSH中的现有文档中插入字段

如何向所有文档添加一个字段,其中前 100 个文档的值为 1,接下来的 100 个文档的值为 2,依此类推?

mongoDB文档数组字段中的唯一项如何

Mongodb聚合查找异常值

聚合 $accumulator + $project

在 Mongo 聚合中,可以通过分组生成 3 个不同的计数

通过 docker 运行的 MongoDB 服务器无法互相看到(名称解析中的临时故障)

对 MongoDB 集合中的对象数组进行排序

$group 和 sum + 添加所有大于

将 MongoDB 转移到另一台服务器?

NodeJS + MongoDB:使用 findOne () 从集合中获取数据

Node.js 和 Passport 对象没有方法 validPassword

升级mongodb

使用 Mongoid 和 Ruby 查询最近 30 天的日期范围?

为什么使用 Redis 而不是 MongoDb 进行缓存?

MongoDB 范围查询中 $lt 和 $gt 的顺序

如何在 Rails 中混合使用 mongodb 和传统数据库?

PyMongo 中的警告消息:count is deprecated

在mongoose中查询虚拟属性