'Lookup in MongoDB using spring data

I have a query that would be fairly simple using SQL databases. However, in MongoDB, I'm not sure on how to do it. I am building a notification system. I have a collection that stores notifications, and another that creates a document when the user has seen the notification, as such:

notifications collection:

_id: 1
content: "some content"
targetGroup: "somegroup"

seen-notification collection

_id: 1
notificationId: 1
userName: "johndoe"

I'm building an endpoint that should return all notifications in a specific group, that the user has not already seen. In a SQL pseudo-code, I'm trying to do:

SELECT 
    * 
FROM 
    notifications AS n 
INNER JOIN 
    seen-notification AS sn 
ON n._id = sn.notificationId
WHERE
    sn.notificationId IS NULL
    AND n.targetGroup = "somegroup"

So, basically, a right join with a where clause. I'm using spring data with a MongoRepository. Right now, i'm making two different selects and iterating through them to remove the already seen. I've looked into mongo's $lookup and several SO questions regarding it, but I just couldn't get it work with spring data and MongoRepository. I'm fairly new to mongo with spring data, so maybe there's a way to accomplish this with $lookup and I just didn't figure out how.



Solution 1:[1]

try

https://mongoplayground.net/p/-dZHmP9yj-c

expects collection names of notifications and seenNotifications

@Aggregation(pipeline = { 
    "{$match: { targetGroup: ?0 } }",
    "{$lookup: { from: \"seenNotifications\", localField: \"_id\", foreignField: \"notificationId\", as: \"seenNotificationsDocs\"}}", 
    "{$match: { seenNotificationsDocs: { $size: 0 } } }",
    "{$project: { seenNotificationsDocs: 0 } }",
})
List<Notifications> findUnseenNotificationByTargetGroup(String targetGroup);
@Document("notifications")
public class Notifications {
    
    @Id
    private Integer id;
    
    private String content;
    
    private String targetGroup;

    //getter & setter
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 indybee