按嵌入式文档结构划分的MongoDB组
我想知道我是否可以在MongoDB中执行以下操作。假设我们有这个收藏按嵌入式文档结构划分的MongoDB组,mongodb,Mongodb,我想知道我是否可以在MongoDB中执行以下操作。假设我们有这个收藏 [{ timestamp: 1, account: 'A', features: { amount: 24, velocity: 6.4 } }, { timestamp: 2, account: 'B', features: { amount: 64, velocity: 4.6 } }, { timestamp: 3, account: 'C',
[{
timestamp: 1,
account: 'A',
features: {
amount: 24,
velocity: 6.4
}
},
{
timestamp: 2,
account: 'B',
features: {
amount: 64,
velocity: 4.6
}
},
{
timestamp: 3,
account: 'C',
features: {
amount: 75,
velocity: 1.4,
latitude: 3.54,
longitude: -1.65
}
}]
我想知道是否有可能根据嵌入文档“功能”的结构对上述文档进行分组。前两个文档应分组在一起,因为嵌入的文档具有相同的结构,而第三个文档应单独分组,因为嵌入的文档与前两个文档具有不同的结构。谢谢你这一点可以通过在该系列上执行的操作来实现 首先投影嵌入的
功能
文档的所有字段
第1阶段:将嵌入的功能
文档转换为新字段并在新字段中投影
{
$project: {
"timestamp": 1,
"account": 1,
"features": 1,
"features_array": { $objectToArray: "$features" }
}
}
第2阶段:在数组中获取密钥并在新字段中投影
{
$project: {
"feature_keys": "$features_array.k"
}
}
第3阶段:然后,您可以在第一个聚合阶段的文档中添加新的“功能键
”字段
{
$group: {"_id": "$feature_keys", "feature_things": { $push: "$$ROOT" }}
}
可以对集合执行此阶段,以按功能键生成文档的分组结果
db.collection.aggregate([
<Stage 1>,
<Stage 2>,
<Stage 3>,
])
我建议使用
$addFields
作为第二阶段(而不是$project
),然后在管道中添加第四阶段以排除功能项。功能项
和功能项。功能项数组
以完成查询。谢谢。我喜欢你建议的改进。在第四阶段,确定何时删除feature\u内容有一个小小的挑战。feature\u keys
看到它用于对文档进行分组,如果您使用此改进对答案进行建议编辑,我将批准。我添加了带有改进的查询。谢谢
db.test.aggregate ([
{
$project: {
"timestamp": 1,
"account": 1,
"features": 1,
"features_array": { $objectToArray: "$features" }
}
},
{
$addFields: {
"feature_keys": "$features_array.k"
}
},
{
$group: {
"_id": "$feature_keys",
"feature_things": { $push: "$$ROOT" }
}
},
{
$project: {
"feature_things.feature_keys": 0,
"feature_things.features_array": 0
}
},
] )