mongodb 何获得所有产品的标题和类别,它属于

r1zhe5dt  于 2023-01-08  发布在  Go
关注(0)|答案(1)|浏览(147)

我想得到它所属的所有产品和类别。我有这个全文搜索查询

db.products.find(
{ $text: { $search: 'IPhone 6' } },
{ score: { $meta: "textScore" } })
.sort({ score:{$meta: "textScore" } })
.limit(100)

结果是下一个x1c 0d1x
它给我所有的产品和它的主要和子类别,但由于我们有一个限制前端是无法显示所有的主要和子类别
不知何故,我需要添加不同的主类别和子类别
看起来聚合是一条路要走,但我不知道如何做到这一点。
会很感激任何帮助!
我希望输出如下所示

{
        "main_category_name": "Lights & Lighting",
        "main_category_id": 39,
        "sub_categories": [
            {
                "sub_сategory_name_1": "Portable Lighting",
                "sub_сategory_id_1": 390503,
                "sub_сategory_name_2": [
                    {
                        "sub_сategory_name_2": "Flashlights & Torches",
                        "sub_сategory_id_2": 150410,
                        "sub_сategory_name_3": []
                    }
                ]
            }
        ]
    }
ffx8fchx

ffx8fchx1#

你可以这样做,但是在3层之后它会变得非常粗糙-我可能会建议更改模式,或者可能只是获取不同的值并在应用层重新构造它们,也就是说-这是可能的:

db.test1.aggregate([{
   $group: { _id: {
     main_category_name: "$main_category_name",
     main_category_id: "$main_category_id",
     sub_category_name_1: "$sub_category_name_1",
     sub_category_id_1: "$sub_category_id_1",
     sub_category_name_2: "$sub_category_name_2",
     sub_category_id_2: "$sub_category_id_2",
   },
   sub_categories: { $addToSet: { sub_category_name_3: "$sub_category_name_3", sub_category_id_3: "$sub_category_id_3" } }
  }
},
{
  $group: {
    _id: {
     main_category_name: "$_id.main_category_name",
     main_category_id: "$_id.main_category_id",
     sub_category_name_1: "$_id.sub_category_name_1",
     sub_category_id_1: "$_id.sub_category_id_1",
   },
   sub_categories: {
     $addToSet: {
       sub_category_id_2: "$_id.sub_category_id_2",
       sub_category_name_2: "$_id.sub_category_name_2",
       sub_categories: "$sub_categories"
     }
   }
 }
},
{
  $group: {
    _id: {
     main_category_name: "$_id.main_category_name",
     main_category_id: "$_id.main_category_id",
   },
   sub_categories: {
     $addToSet: {
       sub_category_id_1: "$_id.sub_category_id_1",
       sub_category_name_1: "$_id.sub_category_name_1",
       sub_categories: "$sub_categories"
     }
   }
 }
}

])

几件小事:
1.不清楚您想要什么命名约定(sub_categoriessub_category_name_n)-所以我将其保持为sub_categories
1.每个聚合管道都需要一个_id-因此您的main_category_namemain_category_id被推了进来。
结果是:

{
    "_id" : {
        "main_category_name" : "test",
        "main_category_id" : 1
    },
    "sub_categories" : [
        {
            "sub_category_id_1" : 2,
            "sub_category_name_1" : "test 1",
            "sub_categories" : [
                {
                    "sub_category_id_2" : 2,
                    "sub_category_name_2" : "test 2",
                    "sub_categories" : [
                        {
                            
                        }
                    ]
                }
            ]
        },
        {
            "sub_category_id_1" : 3,
            "sub_category_name_1" : "test 3",
            "sub_categories" : [
                {
                    "sub_category_id_2" : 5,
                    "sub_category_name_2" : "test 5",
                    "sub_categories" : [
                        {
                            
                        }
                    ]
                },
                {
                    "sub_category_id_2" : 4,
                    "sub_category_name_2" : "test 4",
                    "sub_categories" : [
                        {
                            
                        }
                    ]
                }
            ]
        }
    ]

请注意,最后一层中的{}是因为我的虚拟数据没有sub_category_*_3字段-如果您需要过滤这些字段,可以在应用层轻松完成(聚合阶段也可以)

相关问题