繁体   English   中英

MongoDB聚合,展开,分组(相同数组)?

[英]MongoDB aggregate, unwind, group (same array)?

我有一个具有以下架构的MongoDB集合(“项目”):

const itemSchema = new mongoose.Schema({ 
  name: {
    type: String,
    required: true
    },
  description: String,
  categories: [String]
});

mongoose.model('Item', itemSchema, 'items');

每个项目可以具有多个类别(类别[String])。 我正在使用以下JavaScript尝试获取按展开类别数组元素分组的所有项目。

const itemsGetAllByCategory = function (req, res) { 
Item    
    .aggregate( [
            { '$unwind' : '$categories' }, 
            { '$group' : 
                { '_id': '$categories',
                    'elements': { '$push': 
                      {'name': '$name', 
                       'description': '$description' }
                    }
                }
            }
    ]) 
    .sort({'_id': 1})
    .exec((err, items) => {
        if (err) {
            res
              .status(404)
              .json(err);
        } 
        else {
            res
                .status(200)
                .json(items);
        }
    });
};

数据:

{
"_id" : ObjectId("5be0f88e7b1b91424006d597"),
"name" : "Item 1",
"description" : "Description of Item 1",
"categories" : "[\"Category A\", \"Category B\", \"Category C\"]"
}
{
"_id" : ObjectId("5be0f88e7b1b91424006d598"),
"name" : "Item 2",
"description" : "Description of Item 2",
"categories" : "[\"Category A\", \"Category B\"]"
}
{
"_id" : ObjectId("5be0f88e7b1b91424006d599"),
"name" : "Item 3",
"description" : "Description of Item 3",
"categories" : "[\"Category A\"]"
}

我希望结果输出为:

[{"_id":"Category A",
  "elements":[
   {"name":"Item 1","description":"Description of Item 1"},
   {"name":"Item 2","description":"Description of Item 2"}, 
   {"name":"Item 3","description":"Description of Item 3"}]},
 {"_id":"Category B",
  "elements":[
   {"name":"Item 1","description":"Description of Item 1"},
   {"name":"Item 2","description":"Description of Item 2"}]},
 {"_id":"Category B",
  "elements":[
   {"name":"Item 1","description":"Description of Item 1"}]}]

但是,这段代码为我提供了以下输出:

[{"_id":"[\"Category A\", \"Category B\", \"Category C\"]",
  "elements":[
    {"name":"Item 1","description":"Description of Item 1"}]},
 {"_id":"[\"Category A\", \"Category B\"]",
  "elements":[
    {"name":"Item 2","description":"Description of Item 2"}]},
 {"_id":"[\"Category A\"]",
  "elements":[
    {"name":"Item 3","description":"Description of Item 3"}]}]

$ unwind调用似乎并没有给我提供我希望包含多个类别的任何内容的多个输出文档,并且分组的类别保留为数组而不是单个字符串。 unwind()或group()或两者的代码是否有问题?

原来问题出在数据库中:

categories: "[\"Category A\", \"Category B\", \"Category C\"]"

本来应该:

categories: ["Category A", "Category B", "Category C"]

左括号和右括号后的引号导致该条目存储为单个字符串而不是字符串数组。 感谢Neil Lunn建议我提供更多细节,这使我注意到了这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM