MongoDB агрегирует из объектов в массиве в объект по определенному полю

1

Я хотел бы преобразовать этот тип документа (объекты в массиве):

[{"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. Какие-нибудь мысли?

  • 0
    Итак, вам нужно решить только агрегацию MongoDB?
  • 0
    да, только с использованием агрегации mongodb.
Теги:
aggregation-framework

1 ответ

1

Есть два действительно полезных оператора: $ 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 } } }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню