无法在Spring数据mongodb $ graphLookup中使用子文档字段

时间:2017-07-31 20:03:56

标签: spring-data-mongodb

test_links 集合中的文档显示为:

{ 
    "_id" : "57:58", 
    "from" : {
    "orgunitType" : "Regional", 
    "refId" : "57", 
    "name" : "Root Node"
}, 
    "to" : {
    "orgunitType" : "Department", 
    "refId" : "58", 
    "name" : "Department1"
}, 
"active" : true, 
}

尝试实现MongoDB聚合查询时:

db.test_links.aggregate([
        {$match: {"to.refId":"64"}},
        {$graphLookup:{
             from: "test_links",
             startWith: "$to.refId",
             connectFromField: "from.refId",
             connectToField: "to.refId",
             as: "parents"
        }}]);

作为Spring Data MongoDB:

Aggregation agg = Aggregation.newAggregation(match(where("to.refId").is(id)),
    graphLookup("test_links").startWith("$to.refId").connectFrom("from.refId")
        .connectTo("to.refId").as("parent")
);
AggregationResults results = infraTemplate.aggregate(agg, "test_links", Map.class);

connectFrom connectTo 字段值(from.refId,to.refId)替换为 refId (“from”和“to”剥离)。因此,查询不会返回任何结果。 AggregationField 类的构造函数在目标字段中保留原始名称,并将 name 设置为stripped(“refId”)。 问题是 GraphLookupOperation.toDocument 方法使用 field.getName()而不是 field.getTarget()

...
graphLookup.put("connectFromField", connectFrom.getName()); 
graphLookup.put("connectToField", connectTo.getName());
...

有解决方法吗?它将在未来版本中修复吗? 我知道我可以创建自己的 CustomAggregationOperation ,但如果有人试图开发它,那么使用开箱即用的功能会很好。

Spring Data MongoDB版本2.0.0.M4

1 个答案:

答案 0 :(得分:1)

spring-boot-starter-data-mongodb\1.5.4.RELEASE相同的行为中,不确定是否会这样,但我找到了解决方法。

connectToField: "to.refId"的问题在于,这里使用了嵌入值,通过提供该字段的完整路径,所有工作正常,如预期的那样,因此应更改为:connectToField: "COLLECTION_NAME.to.refId"