Mongodb 将属性收集为数组的Mongo DB
我是Mongo数据库的新手: 我在一个集合中有一个文档,比如说有5个属性(a、B、C、D、E)。而且,集合中的文档包含上述所有或部分属性。我想写一个查询,它将附加所有文档中的属性值Mongodb 将属性收集为数组的Mongo DB,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我是Mongo数据库的新手: 我在一个集合中有一个文档,比如说有5个属性(a、B、C、D、E)。而且,集合中的文档包含上述所有或部分属性。我想写一个查询,它将附加所有文档中的属性值 Document 1 = {Id:123, data:{A:3, B:4, C:34, D:45, E:4}} Document 2 = {Id:123, data:{A:5, E:33}} Document 3 = {Id:123, data:{B:499, C:24, E:39}} Document 4 = {
Document 1 = {Id:123, data:{A:3, B:4, C:34, D:45, E:4}}
Document 2 = {Id:123, data:{A:5, E:33}}
Document 3 = {Id:123, data:{B:499, C:24, E:39}}
Document 4 = {Id:123, data:{A:63, B:34, C:534, D:845, E:84}}
Document 5 = {Id:123, data:{E:4}}
对于ID123,我希望查询输出为
输出文件
{Id:123, A:[3,5,63], B:[4,499,34],C:[34,24,534],D:[45,845],E:[4,33,39,84,4]}
你可以试试这个
db.getCollection('Test02').aggregate([
{$project: {Id: 1, data: { $objectToArray: "$data" } } },
{$unwind: {path: "$data" } },
{$group: { _id: { "Id": "$Id", "key": "$data.k"}, data: { $push: "$data.v" } } },
{$group: { _id: "$_id.Id" , data: { $push: {k:"$_id.key", v:"$data" } } } },
{$project: { data: { $arrayToObject: "$data" } } },
{$replaceRoot: { newRoot: { $mergeObjects: [ {Id: "$_id"}, "$data" ] } } }
])
结果:
{
"Id" : 123.0,
"E" : [
4.0,
33.0,
39.0,
84.0,
4.0
],
"D" : [
45.0,
845.0
],
"C" : [
34.0,
24.0,
534.0
],
"A" : [
3.0,
5.0,
63.0
],
"B" : [
4.0,
499.0,
34.0
]
}
只需按Id分组,将每个数据字段放入数组中
db.collection.aggregate([
{
$group: {
_id: "$Id",
A: {
$push: "$data.A"
},
B: {
$push: "$data.B"
},
C: {
$push: "$data.C"
},
D: {
$push: "$data.D"
},
E: {
$push: "$data.E"
}
}
}
])
将输出您所需的内容
您可以尝试这种方法:(1)在
Id
上分组,并将数据
子文档值推送到一个数组中。然后,投影到reduce(使用$reduce
数组操作符)以输出单个文档。注意:没有像A:{3,5,63}
这样的格式;在MongoDB中,两种复合数据类型是子文档和数组。我想你是说它是一个数组,比如A:[3,5,63]
。是的。我的错误。这是一个数组A:[3,5,63]无需缩减,分组将根据IdI输出一个唯一的文档。获取一个错误,$reduce是未知的$group运算符matthpen-我想根据输出进行连接。你能详细说明一下吗?非常感谢您的投入!为什么这么复杂?@matthPen,因为它是动态的。@SerkanArslan。谢谢。充分学习您的解决方案!