我正在尝试在 mongoTemplate 聚合类中使用 $setIsSubset。但找不到任何解决方案。
我的 Mongo 查询是:
db.events.aggregate([
{ $match: { $and: [
{ "event_state" : {$in : ["live","scheduled"]} },
{ "schedule.end_time" : {$gt : ISODate("2016-12-12T06:30:00.000Z")} }
]
}
},
{$project:
{
"name" :1,
"category" :1,
"schedule":1,
"celebrity" :1,
"online_moderator" :1,
"offline_moderator" :1,
"region" :1,
"status" :1,
"event_state" :1,
"recorder_id" :1,
"webcast_url":1,
"replay_url":1,
"registered_users":1,
registeredUsers: { $size:"$registered_users" },
is_registered:
{ $setIsSubset: [[ObjectId("584e6253e17ed10f0a8cba1d"),ObjectId("583e9719e17e8c1bf80da2fe")], "$registered_users.user_id"]}
}
},
{ $sort : {
"schedule.start_time": 1
}
}
]);
我已经转换了大部分代码,如下所示。但是受到 $setIsSubset 条件的影响。
matchCondition = Aggregation.match(Criteria.where("event_state")
.in(listEventStates).and("schedule.end_time").gt(d));
AggregationOperation projectValues = Aggregation.project()
.and("registered_users").size().as("registered_users_count")
.and("name").as("name").and("category").as("category")
.and("schedule").as("schedule").and("online_moderator")
.as("online_moderator").and("offline_moderator")
.as("offline_moderator").and("region").as("region")
.and("status").as("status").and("event_state")
.as("event_state").and("recorder_id").as("recorder_id")
.and("webcast_url").as("webcast_url").and("replay_url")
.as("replay_url");
sortCondition = Aggregation.sort(Sort.Direction.ASC,
"schedule.start_time");
Aggregation aggrigation = Aggregation.newAggregation(matchCondition,
sortCondition, projectValues);
编辑:
根据@user_531 的请求。我正在用对我有用的可能解决方案来更新我的问题。我不知道它是否会起作用,因为我使用该解决方案已经 2 年了。在那之后,我又改了几次代码,我不再维护这个项目了。但值得一试。
AggregationOperation projectValues = Aggregation.project().and("registered_users").size()
.as("registered_users_count").and("event_image").as("event_image")
.and("name").as("name").and("category").as("category").and("schedule").as("schedule")
.and("region").as("region").and("status").as("status").and("event_state").as("event_state")
.and("recorder_id").as("recorder_id").and("webcast_url").as("webcast_url").and("replay_url")
.as("replay_url").and("registered_users").as("registered_users").and("room_details").as("room_details")
.and("live_stream_url").as("live_stream_url")
.and(new AggregationExpression() {
public DBObject toDbObject(AggregationOperationContext context) {
return new BasicDBObject("$setIsSubset", Arrays.<Object> asList(
Arrays.<Object> asList(new ObjectId("58528314e17edbb252692815")),
"$registered_users.user_id"));
}
}).as("is_registered");
Aggregation aggrigation = Aggregation.newAggregation(matchCondition, sortCondition, projectValues);
AggregationResults<Events> results = mongoTemplate.aggregate(aggrigation, "events", Events.class);