聚合MongoDB的问题

时间:2019-09-19 14:13:05

标签: mongodb

我在将MongoDB中的产品文档汇总时遇到问题。

我的产品文档是:

iframes

我的类别文档是:

{
    "_id" : ObjectId("5d81171c2c69f45ef459e0af"),
    "type" : "T-Shirt",
    "name" : "Panda",
    "description" : "Panda's are cool.",
    "image" : ObjectId("5d81171c2c69f45ef459e0ad"),
    "created_at" : ISODate("2019-09-17T18:25:48.026+01:00"),
    "is_featured" : false,
    "sizes" : [
        "XS",
        "S",
        "M",
        "L",
        "XL"
    ],
    "tags" : [ ],
    "pricing" : {
        "price" : 26,
        "sale_price" : 8
    },
    "categories" : [
        ObjectId("5d81171b2c69f45ef459e086"),
        ObjectId("5d81171b2c69f45ef459e087")
    ],
    "sku" : "5d81171c2c69f45ef459e0af"
},

我的目的是对产品文档进行汇总,以计算每个类别中的项目数。所以我有“艺术”类别,我需要计算产品是否属于“艺术”类别:

我当前的汇总:

{
    "_id" : ObjectId("5d81171b2c69f45ef459e087"),
    "name" : "Art",
    "description" : "These items are our artsy options.",
    "created_at" : ISODate("2019-09-17T18:25:47.196+01:00")
},

实际上可以工作,但不能满足我的需求

db.product.aggregate( 
 { $unwind : "$categories" },
 { 
     $group : { 
        "_id" : { "name" : "$name" },
        "doc" : { $push : { "category" : "$categories" } },
   }
 },
 { $unwind : "$doc" },
 { 
     $project : { 
        "_id" : 0, 
        "name" : "$name", 
        "category" : "$doc.category" 
     } 
 },
 { 
     $group : { 
     "_id" : "$category",
     "name": { "$first": "$name" },
      "items_in_cat" : { $sum : 1 } 
    } 
 },
 { "$sort" : { "items_in_cat" : -1 } },
 )

我们可以看到名称是{ "_id" : ObjectId("5d81171b2c69f45ef459e082"), "name" : null, // Why is the name of the category no here? "items_in_cat" : 4 }, 。如何将输出汇总为:

null

1 个答案:

答案 0 :(得分:1)

我们需要使用$lookupCategory集合中获取名称。

以下查询可以为我们提供预期的输出:

db.product.aggregate([
    {
        $unwind:"$categories"
    },
    {
        $group:{
            "_id":"$categories",
            "items_in_cat":{
                $sum:1
            }
        }
    },
    {
        $lookup:{
            "from":"category",
            "let":{
                "id":"$_id"
            },
            "pipeline":[
                {
                    $match:{
                        $expr:{
                            $eq:["$_id","$$id"]
                        }
                    }
                },
                {
                    $project:{
                        "_id":0,
                        "name":1
                    }
                }
            ],
            "as":"categoryLookup"
        }
    },
    {
        $unwind:{
            "path":"$categoryLookup",
            "preserveNullAndEmptyArrays":true
        }
    },
    {
        $project:{
            "_id":1,
            "name":{
                $ifNull:["$categoryLookup.name","NA"]
            },
            "items_in_cat":1
        }
    }
]).pretty()

数据集:

收藏夹:产品

{
    "_id" : ObjectId("5d81171c2c69f45ef459e0af"),
    "type" : "T-Shirt",
    "name" : "Panda",
    "description" : "Panda's are cool.",
    "image" : ObjectId("5d81171c2c69f45ef459e0ad"),
    "created_at" : ISODate("2019-09-17T17:25:48.026Z"),
    "is_featured" : false,
    "sizes" : [
        "XS",
        "S",
        "M",
        "L",
        "XL"
    ],
    "tags" : [ ],
    "pricing" : {
        "price" : 26,
        "sale_price" : 8
    },
    "categories" : [
        ObjectId("5d81171b2c69f45ef459e086"),
        ObjectId("5d81171b2c69f45ef459e087")
    ],
    "sku" : "5d81171c2c69f45ef459e0af"
}

收藏夹类别

{
    "_id" : ObjectId("5d81171b2c69f45ef459e086"),
    "name" : "Art",
    "description" : "These items are our artsy options.",
    "created_at" : ISODate("2019-09-17T17:25:47.196Z")
}
{
    "_id" : ObjectId("5d81171b2c69f45ef459e087"),
    "name" : "Craft",
    "description" : "These items are our artsy options.",
    "created_at" : ISODate("2019-09-17T17:25:47.196Z")
}

输出:

{
    "_id" : ObjectId("5d81171b2c69f45ef459e087"),
    "items_in_cat" : 1,
    "name" : "Craft"
}
{
    "_id" : ObjectId("5d81171b2c69f45ef459e086"),
    "items_in_cat" : 1,
    "name" : "Art"
}