【发布时间】: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