首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用多标准mongodb java聚合的$lookup

使用多标准mongodb java聚合的$lookup
EN

Stack Overflow用户
提问于 2020-04-20 09:56:34
回答 1查看 99关注 0票数 0

有以下两个集合:

用户集合

代码语言:javascript
复制
{
userId:user1,
creationTimeStamp:2019-11-05T08:15:30
status:active
},
{
userId:user2,
creationTimeStamp:2019-10-05T08:15:30
status:active
}

文档集合

代码语言:javascript
复制
{
userId:user1,
category:Development
published:true
},
{
userId:user2,
category:Development
published:false
}

我想连接这两个集合,并过滤用户,以便在创建时间戳之间,文档属于开发类别,并且不是从活动用户发布的

如何编写mongodb java聚合才能得到这样的结果:

代码语言:javascript
复制
{
userId: user2,
status:active,
category:Development,
published:false
}
EN

回答 1

Stack Overflow用户

发布于 2020-04-20 14:31:36

您还没有提到User集合中userId的重复。

所以这个脚本是

代码语言:javascript
复制
[{
    $match: {
        category: "Development",
        published: false
    }
}, {
    $lookup: {
        from: 'user',
        localField: 'userId',
        foreignField: 'userId',
        as: 'joinUser'
    }
}, {
    $unwind: {
        path: "$joinUser",
        preserveNullAndEmptyArrays: true
    }
}, {
    $match: {
        "joinUser.status": "active"
    }
}, {
    $addFields: {
        "status": "$joinUser.status"
    }
}, {
    $project: {
        _id: 0,
        userId: 1,
        category: 1,
        published: 1,
        status: 1
    }
}]

和java代码,

包括这些导入

代码语言:javascript
复制
import static org.springframework.data.mongodb.core.aggregation.Aggregation.match;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.lookup;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.unwind;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.project;

方法是,

代码语言:javascript
复制
public Object findAllwithVideos() {
    Aggregation aggregation=Aggregation.newAggregation(
        match(Criteria.where("category").is("Development").and("published").is(false)),
        lookup("user","userId","userId","joinUser"),
        unwind("joinUser",true),
        new AggregationOperation(){
            @Override
            public Document toDocument(AggregationOperationContext aggregationOperationContext){
                return new Document("$addFields",
                    new Document("status","$joinUser.status")
                );
            }
        },
        project("userId","category","published","status")
    ).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());

    return mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(Document.class), Object.class);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61314016

复制
相关文章

相似问题

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