我有一些这种结构的文档 - 类别字段也可以是空的
{
"_id" : "1",
"category" : [
{ "target" : "element 1" },
{ "target" : "element 2" }
]
},
{
"_id" : "2",
"category" : [
{ }
]
},
{
"_id" : "3",
"category" : [
{ "target" : "element 1" },
{ "target" : "element 2" }
]
},
我需要的是像
这样的结果{ id: 1, element: "element 1" },
{ id: 1, element: "element 2" },
{ id: 3, element: "element 1" },
{ id: 3, element: "element 2" }
这意味着首先我必须检查所有具有目标元素的文档:
var result = db.collection.find({}, { 'category.target': 1})
1)但这不起作用,因为我仍然得到空文档(2)。
2)其次,我需要为target-array中的每个元素获取一个新的result元素。我认为聚合不是正确的方法,因为每个元素都必须有新的对象。而地图只是在田野里。
所以我认为我必须迭代结果并构建一个新对象,对吗?
result.forEach(function($res){
// do a new foreach for every element in target-array?
newResult.push({ id: res._id, element: res.element });
});
答案 0 :(得分:2)
您可以使用aggregate
执行此操作,与find
不同,MoqaLate允许您重塑文档。
db.test.aggregate([
// Duplicate each doc, once per category element
{$unwind: '$category'},
// Reshape the documents to create the element field
{$project: {element: '$category.target'}},
// Only include docs with an element
{$match: {element: {$exists: true}}}
])
结果:
"result" : [
{
"_id" : "1",
"element" : "element 1"
},
{
"_id" : "1",
"element" : "element 2"
},
{
"_id" : "3",
"element" : "element 1"
},
{
"_id" : "3",
"element" : "element 2"
}
]