конвейер агрегации родительских дочерних элементов mongodb - PullRequest
4 голосов
/ 22 апреля 2019

Мои документы в коллекции:

/* 1 createdAt:4/22/2019, 4:53:32 PM*/
{
    "_id" : ObjectId("5cbdab3c9bd57541040342a1"),
    "created_on" : "2017-03-07T21:07:04.778Z",
    "feature" : "Source",
    "feature_option" : "write",
    "icon" : "fa fa-plus",
    "is_deleted" : false,
    "level" : 2,
    "modified_on" : "2017-03-07T21:07:04.778Z",
    "name" : "Read",
    "parent_feature" : "Contact"
},

/* 2 createdAt:4/22/2019, 4:52:58 PM*/
{
    "_id" : ObjectId("5cbdab1a9bd575410403429f"),
    "created_on" : "2017-03-07T21:07:04.778Z",
    "feature" : "Source",
    "feature_option" : "read",
    "icon" : "fa fa-plus",
    "is_deleted" : false,
    "level" : 2,
    "modified_on" : "2017-03-07T21:07:04.778Z",
    "name" : "Read",
    "parent_feature" : "Contact"
},

/* 3 createdAt:5/9/2018, 8:41:42 PM*/
{
    "_id" : ObjectId("5af316b6141292374cbf363b"),
    "created_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "feature" : "Survey",
    "feature_option" : "delete",
    "icon" : "fa fa-plus",
    "is_deleted" : false,
    "level" : 2,
    "modified_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "name" : "Delete",
    "feature_id" : "1",
    "parent_feature" : null
},

/* 4 createdAt:5/9/2018, 8:41:42 PM*/
{
    "_id" : ObjectId("5af316b6141292374cbf363a"),
    "created_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "feature" : "Survey",
    "feature_option" : "edit",
    "icon" : "fa fa-plus",
    "is_deleted" : false,
    "level" : 2,
    "modified_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "name" : "Edit",
    "feature_id" : "1",
    "parent_feature" : null
},

/* 5 createdAt:5/9/2018, 8:41:42 PM*/
{
    "_id" : ObjectId("5af316b6141292374cbf3639"),
    "created_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "feature" : "Survey",
    "feature_option" : "write",
    "icon" : "fa fa-plus",
    "is_deleted" : false,
    "level" : 2,
    "modified_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "name" : "Write",
    "parent_feature" : null
},

/* 6 createdAt:5/9/2018, 8:41:42 PM*/
{
    "_id" : ObjectId("5af316b6141292374cbf3638"),
    "created_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "feature" : "Survey",
    "feature_option" : "read",
    "icon" : "fa fa-plus",
    "is_deleted" : false,
    "level" : 2,
    "modified_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "name" : "Read",
    "parent_feature" : null
},

/* 7 createdAt:5/9/2018, 8:41:27 PM*/
{
    "_id" : ObjectId("5af316a7141292374cbf3637"),
    "created_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "feature" : "Contact",
    "feature_option" : "delete",
    "icon" : "fa fa-plus",
    "is_deleted" : false,
    "level" : 2,
    "modified_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "name" : "Delete",
    "parent_feature" : "Survey"
},

/* 8 createdAt:5/9/2018, 8:41:27 PM*/
{
    "_id" : ObjectId("5af316a7141292374cbf3636"),
    "created_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "feature" : "Contact",
    "feature_option" : "edit",
    "icon" : "fa fa-plus",
    "is_deleted" : false,
    "level" : 2,
    "modified_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "name" : "Edit",
    "parent_feature" : "Survey"
},

/* 9 createdAt:5/9/2018, 8:41:27 PM*/
{
    "_id" : ObjectId("5af316a7141292374cbf3635"),
    "created_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "feature" : "Contact",
    "feature_option" : "write",
    "icon" : "fa fa-plus",
    "is_deleted" : false,
    "level" : 2,
    "modified_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "name" : "Write",
    "parent_feature" : "Survey"
},

/* 10 createdAt:5/9/2018, 8:41:27 PM*/
{
    "_id" : ObjectId("5af316a7141292374cbf3634"),
    "created_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "feature" : "Contact",
    "feature_option" : "read",
    "icon" : "fa fa-plus",
    "is_deleted" : false,
    "level" : 2,
    "modified_on" : ISODate("2017-03-08T02:07:04.778+05:00"),
    "name" : "Read",
    "parent_feature" : "Survey"
}

Мой текущий конвейер агрегации

db.feature2.aggregate([
        {
            $group: {
                _id: {
                    parent: "$parent_feature",
                    feature: "$feature"
                },
                features: { $push: "$feature_option" }
            }
        },
        {
            $group: {
                _id: "$_id.parent",
                features: { $push: { name: "$_id.feature", feature: "$features" } }
            }
        },
        {
            $project: {
                _id: 0,
                parent: "$_id",
                features: 1
            }
        }
    ]);

Мой текущий вывод:

   /* 1 */
{
    "features" : [
        {
            "name" : "Survey",
            "feature" : [
                "read",
                "write",
                "edit",
                "delete"
            ]
        }
    ],
    "parent" : null
},

/* 2 */
{
    "features" : [
        {
            "name" : "Source",
            "feature" : [
                "read",
                "write"
            ]
        }
    ],
    "parent" : "Contact"
},

/* 3 */
{
    "features" : [
        {
            "name" : "Contact",
            "feature" : [
                "read",
                "write",
                "edit",
                "delete"
            ]
        }
    ],
    "parent" : "Survey"
}

Мой желаемый вывод:

/* 1 */
{
    "features" : [
        {
            "name" : "Survey",
            "feature" : [
                "read",
                "write",
                "edit",
                "delete"
            ],
            children:[
                {
                    "name" : "Contact",
                    "feature" : [
                        "read",
                        "write",
                        "edit",
                        "delete"
                    ],
                    children:[
                        {
                            "name" : "Source",
                            "feature" : [
                                "read",
                                "write"
                            ]
                        }
                    ]
                }
            ]
        }
    ],
    "parent" : null
}

Я работал над этим некоторое время, я пробовал разные вещи, но не смог добиться успеха. в моих данных есть связь с родителями и детьми. Что я хочу, так это то, что Main parent (чей родитель имеет значение null означает, что у него нет родителя) находится сверху, а затем я хочу массив дочерних элементов внутри каждого из родителей. Заранее спасибо!

...