Home > Software design >  Aggregation Annotation Not Working It is Returning Empty [SOLVED]
Aggregation Annotation Not Working It is Returning Empty [SOLVED]

Time:05-19

This has been solved, I'll maintain because I may help some member from community.

I am trying to make this Aggregation bellow using Spring Java, but it's returning an Empty List on my console. This is working on MongoDB, but not on my spring application.

This is my MongoDB Query:

db.collection.aggregate([
  {
    $match: {
      $and: [
        {
          user_id: "256f5280-fb49-4ad6-b7f5-65c4329d46e0"
        },
        {
          time: {
            $gte: 1622471890,
            $lt: 1822471890
          }
        }
      ]
    }
  },
  {
    $sort: {
      time: -1
    }
  }
])

It's return me 2 results:

[
  {
    "_id": ObjectId("5a934e000102030405000001"),
    "message": "This is an example of my db (1)",
    "time": 1.62247189e 09,
    "user_id": "256f5280-fb49-4ad6-b7f5-65c4329d46e0"
  },
  {
    "_id": ObjectId("5a934e000102030405000002"),
    "message": "This is an example of my db (2)",
    "time": 1.62247189e 09,
    "user_id": "256f5280-fb49-4ad6-b7f5-65c4329d46e0"
  }
]

My Problem is when I do this using Mongo with Spring Java:

My Repository

@Aggregation(pipeline = {
    "{"  
        "$match: {"  
          "$and: ["  
            "{"  
              "user_id: ?2"  
            "},"  
            "{"  
              "time: {"  
                "$gte: ?0,"  
                "$lt: ?1"  
              "}"  
            "}"  
          "]"  
        "}"  
      "}",
      "{"  
        "$sort: {"  
          "time: -1"  
        "}"  
    "}"
})
List<MessagesUser> findByPeriodAndUserIdPaginated(long from, long to, String user_id, Pageable pageable);

A part of My Entity

@Document
public class MessagesUser{

    public MessagesUser(String user_id, Long time) {
        this.user_id = user_id;
        this.time = time;
    }

A part of My Service

@Override
public Page<MessagesUser> findAllBetween(Date from, Date to, Pageable page, String user_id) {

    List<MessagesUser> messagesUserList = messagesUserRepository.findByPeriodAndUserIdPaginated(from.getTime() / 1000, to.getTime() / 1000, user_id, page);
    
    System.out.println("messagesUserList: ");
    System.out.println(messagesUserList); // It is the empty list

This Java Query Repository is returning to me an empty array instead of my 2 values. You should see the Dataset and an example working well on MongoDB Query here: Mongo playground

CodePudding user response:

There is a problem with your annotation

You have used

"user_id: ?2"

but user_id is a 4th param then you need to use

"user_id: ?3"

CodePudding user response:

I Found The Solution

After Gibbs answer I had an idea (to check if query was executing the correct variables) and I found the problem, but it was in my @Document collection name.

First I added Query Logs on my console application to see if it was working well, and It was!

To check logs I Added this line on my application.properties logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG

And I saw that Query was correct by log, but the collection name that the Query executing was incorrect, It was executing on messagesUser instead messagesuser, so I changed the collection name in my Entity MessagesUser and it worked.

After (It solved and It's Working)

@Document(collection="messagesuser")
public class MessagesUser{

    public MessagesUser(String user_id, Long time) {
        this.user_id = user_id;
        this.time = time;
    }
// [continuation of the entity code...]

Before (It wasn't working)

@Document
public class MessagesUser{

    public MessagesUser(String user_id, Long time) {
        this.user_id = user_id;
        this.time = time;
    }
// [continuation of the entity code...]
  • Related