【发布时间】:2016-02-08 13:43:54
【问题描述】:
我有三个文件
{ "_id" : 3, "quizzes" : [ 4, 5, 5 ], "labs" : [ 6, 5 ], "final" : 78, "midterm" : 70 }
{ "_id" : 2, "quizzes" : [ 9, 10 ], "labs" : [ 8, 8 ], "final" : 95, "midterm" : 80 }
{ "_id" : 1, "quizzes" : [ 10, 6, 7 ], "labs" : [ 5, 8 ], "final" : 80, "midterm" : 75, "extraMarks" : 10 }
我必须查询考试总字段作为期末+期中+附加分的总和。 查询如下: 查询1:
db.students.aggregate([ { "$project": { "final": 1, "midterm": 1, "examTotal": { "$add": [ "$final", "$midterm", { "$ifNull": [ "$extraMarks", 10 ] } ] } } } ])
但除此之外,我只需要为 id 大于等于 1 且小于等于 2 的人获取此信息
所以我将代码修改为以下内容: 查询2:
db.students.aggregate([ { $match: { $and: [ { _id: { $gte: 1, $lte: 2 } }]}}, { "$project": { "final": 1, "midterm": 1, "examTotal": { "$add": [ "$final", "$midterm", { "$ifNull": [ "$extraMarks", 10 ] } ] } } } ])
如何将此代码转换为查询 1 的 Java 代码我编写了代码并且正在工作?如何在现有代码中添加匹配阶段如下:
BsonArray fields=new BsonArray();
BsonArray defaultValue1=new BsonArray();
defaultValue1.add(new BsonString("$extraMarks"));
defaultValue1.add(new BsonDouble(0d));
BsonDocument ifNullProjection=new BsonDocument();
ifNullProjection.put("$ifNull",defaultValue1);
fields.add(new BsonString("$final"));
fields.add("$midterm");
fields.add(ifNullProjection);
BsonDocument addObject=new BsonDocument();
addObject.append("$add", fields);
BsonDocument valueTobeUpdate=new BsonDocument();
valueTobeUpdate.append("sum", addObject);
BsonDocument mainProjection=new BsonDocument();
mainProjection.append("$project", valueTobeUpdate);
List<BsonDocument> pipeline=new ArrayList<BsonDocument>();
pipeline.add(mainProjection);
AggregateIterable<Document> iterable = refCollection.aggregate(pipeline);
如何在上面显示的代码中添加 $match 运算符?有什么建议吗?
【问题讨论】:
-
你为什么不
pipeline.add比赛舞台,就像你加了投影舞台一样?
标签: mongodb mongodb-query aggregation-framework mongodb-java