Структура агрегирования MongoDB имеет $ arrayElemAt , но не $objectElemAt
, где вы можете передать expression
для получения значения объекта.
Обход: Нам нужно преобразовать объект в массив, отфильтровать это key:value
и вернуть значение.
{a:"hello", b:"world", c:"!"}
to
[ {k:"a", v:"hello"}, {k:"b", v:"world"}, {k:"c", v:"!"} ]
Попробуйте это:
db.collection.aggregate([
{
$addFields: {
data: {
$reduce: {
input: {
$map: {
input: ["a","b","c"],
as: "abc",
in: {
$let: {
vars: {
someObject: {
$filter: {
input: {
$objectToArray: {a: "hello ",b: "world",c: "!"}
},
cond: {
$eq: ["$$this.k","$$abc"]
}
}
}
},
in: {
$ifNull: [
{
$arrayElemAt: ["$$someObject.v", 0]
},
""
]
}
}
}
}
},
initialValue: "",
in: {
$concat: ["$$value","$$this"]
}
}
}
}
}
])
MongoPlayground