Я хотел бы преобразовать этот тип документа (объекты в массиве):
[{"name": "david", "props": {"prop1": {"AR": 9, "NY": 8}, "prop2":
{"AR": 10, "NY": 9}}},
{"name": "john", "props": {"prop1": {"AR": 7, "NY": 8}, "prop2": {"AR":
8, "NY": 9}}}]
в этот (фильтрация по полю "AR"):
{"david": {"prop1": 9, "prop2": 10}, "john": {"prop1": 7, "prop2": 8}}
используя агрегаты MongoDB. Какие-нибудь мысли?
Есть два действительно полезных оператора: $ objectToArray, который преобразует объект в массив из kv
пар и $ arrayToObject, который преобразует этот массив обратно в объект. Таким образом, вы должны использовать первый, изменить свои объекты, а затем использовать второй. Итак, имея такой документ:
{
array: [
{"name": "david", "props": {"prop1": {"AR": 9, "NY": 8}, "prop2": {"AR": 10, "NY": 9}}},
{"name": "john", "props": {"prop1": {"AR": 7, "NY": 8}, "prop2": {"AR": 8, "NY": 9}}}
]
}
Вы можете использовать агрегацию ниже:
db.col.aggregate([
{
$project: {
output: {
$arrayToObject: {
$map: {
input: "$array",
as: "doc",
in: {
k: "$$doc.name",
v: {
$arrayToObject: {
$map: {
input: { $objectToArray: "$$doc.props" },
as: "prop",
in: { k: "$$prop.k", v: "$$prop.v.AR" }
}
}
}
}
}
}
}
}
}
])
Какие результаты:
{ "_id" : ..., "output" : { "david" : { "prop1" : 9, "prop2" : 10 }, "john" : { "prop1" : 7, "prop2" : 8 } } }