首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不能在Spring $graphLookup中使用子文档字段

不能在Spring $graphLookup中使用子文档字段
EN

Stack Overflow用户
提问于 2017-07-31 20:03:55
回答 1查看 461关注 0票数 3

集合test_links中的文档如下:

代码语言:javascript
复制
{ 
    "_id" : "57:58", 
    "from" : {
    "orgunitType" : "Regional", 
    "refId" : "57", 
    "name" : "Root Node"
}, 
    "to" : {
    "orgunitType" : "Department", 
    "refId" : "58", 
    "name" : "Department1"
}, 
"active" : true, 
}

在尝试实现MongoDB聚合查询时:

代码语言:javascript
复制
db.test_links.aggregate([
        {$match: {"to.refId":"64"}},
        {$graphLookup:{
             from: "test_links",
             startWith: "$to.refId",
             connectFromField: "from.refId",
             connectToField: "to.refId",
             as: "parents"
        }}]);

作为Spring数据,MongoDB:

代码语言:javascript
复制
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);

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

代码语言:javascript
复制
...
graphLookup.put("connectFromField", connectFrom.getName()); 
graphLookup.put("connectToField", connectTo.getName());
...

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

Spring数据MongoDB版本2.0.0.M4

EN

回答 1

Stack Overflow用户

发布于 2018-01-16 12:34:35

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

connectToField: "to.refId"的问题是,这里使用了嵌入式值,通过提供到该字段的完整路径,一切正常工作,就像预期的那样,因此应该改为:connectToField: "COLLECTION_NAME.to.refId"

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45424401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档