按嵌入式文档结构划分的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',

我想知道我是否可以在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',
  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
    } 
  },
 ] )