聚合注释不起作用它返回空
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...]
我正在尝试使用 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" +
在
首先,我在我的控制台应用程序上添加了查询日志,以查看它是否运行良好,确实如此!
为了检查日志,我在 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...]