我是mongodb的新手,需要在java中使用等效的代码
db.asset.aggregate([{
$unwind : '$asset'
}, {
$match : {
'asset.status' : {
$in : ['1', '2', '3']
},
'asset.siteid' : {
$in : ['123']
}
}
}
]).pretty()
我尝试了以下操作,但它没有帮助
DBObject unwind = new BasicDBObject("$unwind", "$dp.asset");
DBObject match = BasicDBObjectBuilder.start().push("$match")
.push("dp.asset.status").add("$in", ['ACTIVE', 'LIMITEDUSE', 'OPERATING'])
.push("dp.asset.siteid").add("$in", ['BEDFORD']).get();
AggregationOutput aggr = collection.aggregate(Arrays.asList(unwind, match));
注意:我使用的是mongodb 3.4.1
答案 0 :(得分:2)
不确定为什么在传递数组值时使用单引号。
传递值的正确语法是
DBObject match = BasicDBObjectBuilder.start().push("$match")
.push("$dp.asset.status").add("$in", Arrays.asList("ACTIVE", "LIMITEDUSE", "OPERATING"))
.push("$dp.asset.siteid").add("$in", Arrays.asList("BEDFORD")).get();
或者
DBObject match = BasicDBObjectBuilder.start().push("$match")
.push("$dp.asset.status").add("$in", new String[]{"ACTIVE", "LIMITEDUSE", "OPERATING"})
.push("$dp.asset.siteid").add("$in", new String[]{"BEDFORD"}).get();
对于3.x驱动程序,您应该使用Document。
Document unwind = new Document("$unwind", "$dp.asset");
Document match = new Document("$match", new Document("$dp.asset.status", new Document("$in", new String[]{"ACTIVE", "LIMITEDUSE", "OPERATING"})).
append("$dp.asset.siteid", new Document("$in", new String[]{"BEDFORD"})));
Mongo查询代码。
Document unwind = new Document("$unwind", "$asset");
Document match = new Document("$match", new Document("$asset.status", new Document("$in", new String[]{"1", "2", "3"})).
append("$asset.siteid", new Document("$in", new String[]{"123"})));
答案 1 :(得分:1)
mongo shell聚合操作中的字段与当前Java管道中的字段不匹配。
除了这种异常,您可以尝试以下管道:
BasicDBList statusList = new BasicDBList();
statusList.add("1");
statusList.add("2");
statusList.add("3");
DBObject statusInClause = new BasicDBObject("$in", statusList);
BasicDBList idList = new BasicDBList();
idList.add("123");
DBObject siteIdInClause = new BasicDBObject("$in", idList);
DBObject fields = new BasicDBObject("asset.status", statusInClause);
fields.put("asset.siteid", siteIdInClause);
DBObject unwind = new BasicDBObject("$unwind", "$asset");
DBObject match = new BasicDBObject("$match", fields);
AggregationOutput aggr = collection.aggregate(Arrays.asList(unwind, match));