聚合注释不起作用它返回空

Aggregation Annotation Not Working It is Returning Empty

我正在尝试使用 Spring Java 进行此聚合,但它在我的控制台上 returning 一个 空列表 。这适用于 MongoDB,但不适用于我的 spring 应用程序。

这是我的Mongo数据库查询:

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

这是 return 我 2 个结果:

[
  {
    "_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"
  }
]

我的问题是当我使用 Mongo 和 Spring Java:

我的存储库

@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);

我的服务的一部分

@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

这个 Java 查询存储库 return 给我一个空数组而不是我的 2 个值。您应该在此处看到 Dataset 和一个在 MongoDB 查询上运行良好的示例:Mongo playground

你的注释有问题

您已使用

"user_id: ?2" +

但是 user_id 是第 4 个参数,那么您需要使用

"user_id: ?3" +

之后我有了一个想法(检查查询是否正在执行正确的变量)并且我发现了问题,但它在我的 @Document 集合中名字.

首先,我在我的控制台应用程序上添加了查询日志,以查看它是否运行良好,确实如此!

为了检查日志,我在 application.properties 中添加了这一行 logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG

而且我通过日志看到查询是正确的,但是查询执行的集合名称不正确,它是在 messagesUser 而不是 messagesuser,所以我在我的 Entity MessagesUser 中更改了集合名称并且它起作用了。

之后(已解决并且正在运行)

@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...]

之前(没用)

@Document
public class MessagesUser{

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