繁体   English   中英

Spring MongoDB MongoTemplate聚合查询,如何返回列表 <List<Object> &gt;

[英]Spring MongoDB MongoTemplate Aggregate query, how to return a List<List<Object>>

我徒劳地搜寻,现在向群众提出问题。

  • 我有一个GpsRecord的集合,每个GpsRecord属于一个TrackRecord
  • 每个GpsRecord都有一个引用其父TrackRecordObjectId
  • 我想根据TrackRecord.ids列表查询GpsRecord集合

从这个查询中,我想从List<List<GpsRecord>>的聚合查询返回List<List<GpsRecord>> 我的问题是如何在.aggregate(agg, GpsRecord.class, List<List<GpsRecord>>)正确定义outputType参数?

@Repository
public class GpsRepositoryImpl implements GpsRepositoryCustom {

    private final MongoTemplate _mongoTemplate;

    @Autowired
    public GpsRepositoryImpl(MongoTemplate mongoTemplate) {
        _mongoTemplate = mongoTemplate;
    }

    @Override
    public List<List<GpsRecord>> aggregate(List<ObjectId> ids) {
        MatchOperation match = getMatchOperation(ids);
        GroupOperation group = getGroupOperation();
        Aggregation agg = Aggregation.newAggregation(match, group);

        return _mongoTemplate
                   .aggregate(agg, GpsRecord.class, List<List<GpsRecord>>)
                   .getMappedResults();
    }

    private MatchOperation getMatchOperation(List<ObjectId> ids) {
        Criteria criteria = Criteria.where("trackRecord.id").in(ids);

        return new MatchOperation(criteria);
    }

    private GroupOperation getGroupOperation() {
        GroupOperation agg = Aggregation.group("trackRecord.id");

        return agg;
    }

}

编辑

GpsRecord的示例

{
    "_id": ObjectId("593d382c5b3ae715b2cac03d"),
    "_class": "gps",
    "location": {
        "type": "Point",
        "coordinates": [116.315148, 39.984538]
    },
    "dateTime": ISODate("2008-10-23T02:54:40Z"),
    "trackRecord": DBRef("trackRecords", ObjectId("593d382b5b3ae715b2cac029"))
}

跟踪记录示例

{
    "_id": ObjectId("593d382b5b3ae715b2cac029"),
    "_class": "track",
    "name": "20081117155223.plt",
    "bbox": {
        "type": "Polygon",
        "coordinates": [[[116.31949,39.999686],[116.325796,39.999686],[116.325796,40.009678],[116.31949,40.009678],[116.31949,39.999686]]]
    }
}

TrackRecord由许多GpsRecord对象组成,成千上万个甚至更多。

因此,根据ListTrackRecord._id我想返回一个ListList<GpsRecord>

您想要这样的聚合:

db.GpsRecord.aggregate([
    {$group:{_id:"trackRecord.$id", ...}}
])

警告 :管道不能对以下类型的值进行操作:Binary,Symbol,MinKey,MaxKey, DBRef ,Code和CodeWScope

但是,如果您使用MongoDB> = 3.4.4,则有一个新的聚合命令$objectToArray ,它将DBRef转换为数组并允许您对其进行分组。

https://docs.mongodb.com/manual/release-notes/3.4/#apr-21-2017

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM