Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaSpring的mongoTemplate聚合中实现$SetIsSubset?_Java_Spring_Spring Mvc_Mongotemplate - Fatal编程技术网

如何在JavaSpring的mongoTemplate聚合中实现$SetIsSubset?

如何在JavaSpring的mongoTemplate聚合中实现$SetIsSubset?,java,spring,spring-mvc,mongotemplate,Java,Spring,Spring Mvc,Mongotemplate,我试图在mongoTemplate聚合类中使用$setIsSubset。但是找不到任何解决办法 我的Mongo查询是: db.events.aggregate([ { $match: { $and: [ { "event_state" : {$in : ["live","scheduled"]} }, { "schedule.end_time" : {$gt : ISODate("2016-12-12T06:30:00.000Z")} }

我试图在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的请求。我正在用对我有效的可能解决方案更新我的问题。我不知道它是否有效,因为我使用该解决方案已经两年了。在那之后,我又修改了几次代码,我不再维护这个项目了。但值得一试

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);
AggregationOperation projectValues=Aggregation.project()和(“注册用户”)size()
.as(“注册用户数”)和(“事件图像”)as(“事件图像”)
和(“名称”)作为(“名称”)和(“类别”)作为(“类别”)和(“附表”)。作为(“附表”)
和(“区域”)作为(“区域”)和(“状态”)作为(“状态”)和(“事件状态”)作为(“事件状态”)
和(“录制者id”)。作为(“录制者id”)。和(“网络广播url”)。作为(“网络广播url”)和(“重播url”)
.as(“重播url”)。和(“注册用户”)。as(“注册用户”)。和(“房间详细信息”)。as(“房间详细信息”)
和(“实时流url”)。作为(“实时流url”)
.和(新的AggregationExpression(){
公共数据库对象toDbObject(聚合操作上下文){
返回新的BasicDBObject(“$setIsSubset”,Arrays.asList(
Arrays.asList(新ObjectId(“58528314e17edbb252692815”),
“$registered_users.user_id”);
} 
}).作为(“已注册”);
聚合聚合=聚合.newAggregation(匹配条件、排序条件、项目值);
AggregationResults=mongoTemplate.aggregate(聚合,“事件”,事件.class);

您可以为project(com.Mongodb.client.model.Aggregates.project)使用Mongodb api,也可以为match(com.Mongodb.client.model.Aggregates.match(Bson筛选器))使用Mongodb api 您可以使用我刚刚完成的代码,就像使用$setIsSubset的示例一样

有了这个疑问

db.getCollection('collection').aggregate(
 {    $match : {"_id" : "dff26f9c-350b-4bd5-bc62-62c19f21100c"}   },
{ "$project": {
       "sensorId": 1,   "sensorModel": 1,
   "attachments": {
     "$filter": {
   "input": "$attachments",
   "as": "attachment",
   "cond": {
     "$setIsSubset": [
       ["$$attachment.type"],
       ["StructAttachment", "BlobAttachment"]
     ]
   }    }   } }})
java代码如下所示:

List <Bson> aggregationInput = new ArrayList <Bson> ();
aggregationInput.add(match(eq("_id",id)));
HashMap<String, Integer> fieldsMap=new HashMap<String, Integer>();
fieldsMap.put("sensorId", 1);
fieldsMap.put("sensorModel", 1);

ArrayList< ArrayList<String>> isSubset = new ArrayList< ArrayList<String>>();
ArrayList<String> isSubsetParameter1 = new ArrayList<String>();
isSubsetParameter1.add("$$attachment.mimeType");

ArrayList<String> isSubsetParameter2 = new ArrayList<String>();
isSubset.add(isSubsetParameter1 );
isSubset.add(isSubsetParameter2 );

Document docFields = new Document();
if (mimeTypes == null || mimeTypes.isEmpty()) {
List aggregationput=new ArrayList();
aggregationInput.add(匹配(eq('u id',id));
HashMap fieldsMap=新HashMap();
fieldsMap.put(“传感器ID”,1);
fieldsMap.put(“传感器模型”,1);
ArrayListIsubSet=new ArrayList();
ArrayList isSubsetParameter1=新的ArrayList();
isSubsetParameter1.add(“$$attachment.mimeType”);
ArrayList isSubsetParameter2=新的ArrayList();
isSubset.add(isSubsetParameter1);
isSubset.add(isSubsetParameter2);
Document docFields=新文档();
if(mimeTypes==null | | mimeTypes.isEmpty()){
//mimeTypes是一个集合 isSubsetParameter2.addAll(mimeTypes)

文档过滤器=新文档();
filter.put(“输入”,“$attachments”);
过滤。将(“作为”、“附件”);
filter.put(“cond”,新文档(“$setIsSubset”,isSubset));
放置(“附件”,新文档(“$filter”,filter));
docFields.putAll(fieldsMap);
aggregationInput.add(项目(文档字段));
AggregateIterable ResultiteRater=mongo.getDatabase(“db”).getCollection(“collection”)
.合计(合计认沽权);

我希望这对您有用!

利用
攻击性表达式
。在项目中包括以下投影。使用1.8.5 spring mongo数据版本

and(new AggregationExpression() {
    @Override
    public DBObject toDbObject(AggregationOperationContext context) {
        return new BasicDBObject("$setIsSubset",
                Arrays.<Object> asList(
                        Arrays.<Object> asList("584e6253e17ed10f0a8cba1d",
                                "583e9719e17e8c1bf80da2fe"),
                        "$registered_users.user_id"));
    }
}).as("is_registered"));
和(新的AggregationExpression(){
@凌驾
公共数据库对象toDbObject(聚合操作上下文){
返回新的BasicDBObject($SetIsubSet),
数组。asList(
Arrays.asList(“584e6253e17ed10f0a8cba1d”,
“583e9719e17e8c1bf80da2fe”),
“$registered_users.user_id”);
}
}).as(“已注册”);
可以将表达式包装为Java 8的lambda

and(context -> new BasicDBObject("$setIsSubset",
        Arrays.<Object> asList(
                Arrays.<Object> asList("584e6253e17ed10f0a8cba1d",
                         "583e9719e17e8c1bf80da2fe"),
                "$registered_users.user_id")))
.as("is_registered"));
and(context->newbasicdbobject($setIsSubset),
数组。asList(
Arrays.asList(“584e6253e17ed10f0a8cba1d”,
“583e9719e17e8c1bf80da2fe”),
“$registered\u users.user\u id”))
.as(“已注册”);

我正在研究您的解决方案。但我正在努力将object添加到isSubset中。因为其中一个参数是字符串,另一个是object。例如:isSubsetParameter1.add($$registered_users.user_id”);第二个值是user_id,这是ObjectId类型。不幸的是,您(@Guel135)have suggest对我不起作用。因为我必须在同一数组列表数据“isSubset”中同时使用字符串和对象。因此,我使用了一些其他方法来实现同样的目的,通过循环子文档。@Kiran请您提供上述解决方案好吗?@user_531,我使用这种逻辑已经2年了。我试图挖掘代码,看起来我在那里做了另一种方法。但我会尝试发布代码供您参考。不知道这是否会对您产生影响是否为你工作!我将用答案编辑我的问题。请看一看。谢谢。@kiran非常感谢你为此抽出时间。它为我工作:)谢谢@Sagar Reddy。你的解决方案成功了(不是lamda表达式)。但需要做一个小的更正。也就是说,setIsSubset运算符中应该只有一个$“$setIsSubset”不是“$$setIsSubset”。还要感谢关于依赖项(1.8.5)的说明。我的是1.8.0。所以我相应地更改了它。在
AggregationExpression
中没有方法
public DBObject toDbObject(AggregationOperationContext)
可以覆盖。可能是因为依赖项版本。
and(context -> new BasicDBObject("$setIsSubset",
        Arrays.<Object> asList(
                Arrays.<Object> asList("584e6253e17ed10f0a8cba1d",
                         "583e9719e17e8c1bf80da2fe"),
                "$registered_users.user_id")))
.as("is_registered"));