Необходимо рассчитать количество отдельных полей из встроенных коллекций MongoDB - PullRequest
1 голос
/ 14 марта 2019

Мне нужно сосчитать поля во встроенной, а также родительской коллекции в MongoDB. Мой документ состоит из нескольких встроенных коллекций. Я должен получить количество полей вместо фактических данных из БД.

Это моя коллекция образцов,

{
    "_id" : ObjectId("5c58401e354bba286ce4db67"),
    "_class" : "com.model.ProductTemplate",
    "templateName" : "tempnew",
    "printServiceCategories" : [ 
        {
            "_id" : "PSC00001",
            "createdOn" : ISODate("2019-02-04T13:35:52.503Z"),
            "createdBy" : "PRODUCTADMIN",
            "isactive" : true,
            "serviceCategoryDisplayName" : "Finishing",
            "serviceCategoryMappingName" : "Finishing",
            "groupTypes" : [ 
                {
                    "groupTypeId" : "GT00001",
                    "groupTypeDisplayName" : "Binding",
                    "groupTypeMappingName" : "Binding",
                    "printServices" : [ 
                        {
                            "printServiceId" : "PS00003",
                            "printServiceMappingName" : "coil_bind_blue",
                            "printServiceDisplayName" : "Coil Bind Blue",
                            "printServiceImage" : "",
                            "isDefault" : false,
                            "createdBy" : "PRODUCTADMIN"
                        }, 
                        {
                            "printServiceId" : "PS00004",
                            "printServiceDisplayName" : "Coil Bind Black",
                            "isDefault" : true,
                            "createdBy" : "PRODUCTADMIN"
                        }, 
                        {
                            "printServiceId" : "PS00005",
                            "printServiceMappingName" : "comb_bind_black",
                            "printServiceDisplayName" : "Comb Bind Black",
                            "printServiceImage" : "",
                            "isDefault" : false,
                            "createdBy" : "PRODUCTADMIN"
                        }
                    ],
                    "createdBy" : "PRODUCTADMIN"
                }
            ]
        }, 
        {
            "_id" : "PSC00002",
            "createdOn" : ISODate("2019-02-04T13:36:32.794Z"),
            "createdBy" : "PRODUCTADMIN",
            "isactive" : true,
            "serviceCategoryDisplayName" : "Media",
            "serviceCategoryMappingName" : "Media",
            "groupTypes" : [ 
                {
                    "groupTypeId" : "GT00002",
                    "groupTypeDisplayName" : "Paper",
                    "groupTypeMappingName" : "Paper",
                    "printServices" : [ 
                        {
                            "printServiceId" : "PS00006",
                            "printServiceMappingName" : "a3",
                            "printServiceDisplayName" : "A3",
                            "printServiceImage" : "",
                            "isDefault" : false,
                            "createdBy" : "PRODUCTADMIN"
                        }, 
                        {
                            "printServiceId" : "PS00007",
                            "printServiceDisplayName" : "A4",
                            "isDefault" : true,
                            "createdBy" : "PRODUCTADMIN"
                        }
                    ],
                    "createdBy" : "PRODUCTADMIN"
                }
            ]
        }
    ],
    "templateCreatedOn" : ISODate("2019-02-04T13:37:34.025Z"),
    "vendorid" : "5c5838aef57da72804d72ee0",
    "fileoptionstatus" : "withoutFile",
    "isactive" : true,
    "createdBy" : "CLIENTADMIN",
    "additionalServices" : [],
    "file" : {
        "_id" : null
    }
}

Вот коллекция выше Product Template, у меня есть три встроенные коллекции, а именно printServiceCategories, groupTypes, printServices. printServiceCategories состоит из массива groupTypes, тогда как groupTypes состоит из массива printServices. При получении данных из базы данных с помощью приложения весенней загрузки мне просто нужно

 1.count of `printServices` in `Grouptype` 

 2.count of `Grouptype` in `printServiceCategories` .

 3.Similarly count of `printServiceCategories`  in `product template`.

Может ли кто-нибудь помочь мне сделать запрос в соответствии с ожидаемым результатом, как описано выше?

1 Ответ

1 голос
/ 14 марта 2019

Попробуйте что-то вроде ниже:

db.database.aggregate([
    {
       $match: { "_id":ObjectId("5c8a4f4e7c5f002838e61b24") }
    },
    {
        $facet: {
            countOfPrintServices: [
                {
                    $unwind: "$printServiceCategories"
                },
                {
                    $unwind: "$printServiceCategories.groupTypes"
                },
                {
                    $unwind: "$printServiceCategories.groupTypes.printServices"
                },
                {
                    $group: {
                        _id: "$_id",
                        count:{$sum:1}
                    }
                }
            ],
            countOfGrouptypeInPrintServiceCategories : [
                {
                    $unwind: "$printServiceCategories"
                },
                {
                    $unwind: "$printServiceCategories.groupTypes"
                },
                {
                    $group: {
                        _id: "$_id",
                        count:{$sum:1}
                    }
                }
            ],
            countOfPrintServiceCategoriesInProductTemplate: [
                {
                    $unwind: "$printServiceCategories"
                },
                {
                    $group: {
                        _id: "$_id",
                        count:{$sum:1}
                    }
                }
            ]
        }
    }

])

Это может быть не оптимизированное решение, вы получите желаемый результат.

{
    "countOfPrintServices" : [
        {
            "_id" : ObjectId("5c58401e354bba286ce4db67"),
            "count" : 5
        }
    ],
    "countOfGrouptypeInPrintServiceCategories" : [
        {
            "_id" : ObjectId("5c58401e354bba286ce4db67"),
            "count" : 2
        }
    ],
    "countOfPrintServiceCategoriesInProductTemplate" : [
        {
            "_id" : ObjectId("5c58401e354bba286ce4db67"),
            "count" : 2
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...