我正在使用 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 - 也很高兴对此有任何评论!
没有“干净”的方法可以做到这一点,我使用的方法是将对象转换为数组,将其过滤为我想要的键,然后提取值,如下所示:
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
]
}
]
}
}
}
])