我的数据库中的示例记录如下所示:
{
"_id" : 2,
"name" : "Corliss Zuk",
"scores" : [
{
"type" : "exam",
"score" : 87.53859552156015
},
{
"type" : "quiz",
"score" : 24.49132971110967
},
{
"type" : "homework",
"score" : 99.24881912510654
}
]
}
我正在尝试选择所有有家庭作业分数的记录> 90或考试分数< 50。 我的OR条件是这样的:
DBObject clause1 = new BasicDBObject("scores.type", "homework").append("scores.score", new BasicDBObject("$gt", 90));
DBObject clause2 = new BasicDBObject("scores.type", "exam").append("scores.score", new BasicDBObject("$lt", 50));
BasicDBList or = new BasicDBList();
or.add(clause1);
or.add(clause2);
DBObject query = new BasicDBObject("$or", or);
这将获取分数为>的所有记录。 90或者<但是没有涉及被检查分数应该是家庭作业分数或考试分数的条件。 我错过了一个条件,将分数与类型联系起来,然后检查它们的价值。
非常感谢任何帮助。
谢谢, 约翰
答案 0 :(得分:2)
您目前正在有效地执行此操作:
find({
$or:[
{
'scores.type':"exam",
'scores.score':{
$lt:50
}
},
{
'scores.type':"homework",
'scores.score':{
$gt:90
}
}
]
})
这基本上要求MongoDB返回任何元素的类型为“exam”且任何元素的得分高于50.0但不一定是相同元素的文档。
您可以使用$ elemMatch运算符针对同一元素测试多个条件。因此,Java的等价物就可以解决这个问题:
find({
$or:[
{
scores:{
$elemMatch:{
type:"exam",
score:{
$lt:50
}
}
}
},
{
scores:{
$elemMatch:{
type:"homework",
score:{
$gt:90
}
}
}
}
]
})
希望有所帮助。
答案 1 :(得分:2)
DBObject clause1 = new BasicDBObject("scores", new BasicDBObject("$elemMatch", new BasicDBObject("type", "homework").append("score", new BasicDBObject("$gt", 90))));
DBObject clause2 = new BasicDBObject("scores", new BasicDBObject("$elemMatch", new BasicDBObject("type", "exam").append("score", new BasicDBObject("$lt", 50))));
以这种方式使用它。