春季数据:MongoDB:聚合:按嵌套对象分组

时间:2020-03-10 08:29:18

标签: java mongodb mongodb-query spring-data spring-data-mongodb

我正在使用MongoDB 3.2.2和Spring Data 2.1.8。我具有动态data字段的以下文档模型:

@Data
@Accessors(chain = true)
@Document(collection = "someCollection")
public class SomeEntity implements Serializable {

    @Id
    String id;

    //some fields

    Map<String, Object> data;

}

我的目标是通过data字段中的特定键对文档进行分组。例如,我具有以下数据库内容:

{
  "_id": "5e5f8a89b70e4123a8285aa3",
  "data": {
    "someField": "someValue",
  }
},
{
  "_id": "5e5f72fcb70e4123a8285aa2",
  "data": {
    "someField": "someValue",
  }
},
{
  "_id": "5e5d22939ce87e2fccd80973",
  "data": {
    "someField": "otherValue",
  }
}

我想使用Spring Data构建分组聚合,例如对MongoDB的以下查询:

$group: {
  {
    _id: "$data.someField",
    count: {
      $sum: 1
    }
  }
}

我想收到以下结果:

{
  _id: "someValue",
  count: 2
},
{
  _id: "otherValue",
  count: 1
}

为此,我正在使用下一个与org.springframework.data.mongodb.core.aggregation.Aggregation分组:

Aggregation.group("$data.someField").count().as("count")

但是执行聚合时出现错误:

org.springframework.data.mapping.PropertyReferenceException: No property someField found for type Object! Traversed path: SomeEntity.data.

怎么了?有人可以帮我吗?

P.S .:我也曾尝试在data字段中使用$ replaceRoot,所以我可以按someField对文档进行分组,但是它是较新的数据库版本(3.4版中的新功能)

1 个答案:

答案 0 :(得分:0)

是否可能只有一点错字:No property someFiled

尝试以下操作:

group("$data.someField").count().as("count")