【问题标题】:MongoDB aggregate, unwind, group (same array)?MongoDB聚合,展开,分组(同一个数组)?
【发布时间】:2019-04-10 05:29:47
【问题描述】:

我有一个具有以下架构的 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() 或两者的代码是否存在问题?

【问题讨论】:

  • 根据此处的内容,没有人能够复制,因为将返回预期的输出。如果您仍然认为自己有问题,那么我建议 1. 包括 full 聚合管道,因为您截断的输入表明您正在做其他事情而不是显示的阶段,这可能是您的问题所在。 2. 展示一个小的实际数据样本,它可以与完整提供的管道一起重现问题。见How to create a Minimal, Complete, and Verifiable example。你告诉我们你“看到”了什么,但它并不“完整”
  • 已更新,对此感到抱歉。谢谢。
  • 因为“类别”是“字符串”而不是数组。我实际上预计管道会失败并出现错误以表明这一点。可能您的实际数据可能包含单个条目数组,即字符串?但重点是数据存储不正确。

标签: javascript mongodb


【解决方案1】:

原来问题出在数据库中:

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

应该是:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 2015-09-12
    • 2019-04-01
    • 2014-12-01
    • 1970-01-01
    相关资源
    最近更新 更多