Java mongoDB基于两个条件选择记录

Java mongoDB基于两个条件选择记录,java,mongodb,mongodb-java,Java,Mongodb,Mongodb Java,我的数据库中的示例记录如下所示: { "_id" : 2, "name" : "Corliss Zuk", "scores" : [ { "type" : "exam", "score" : 87.53859552156015 }, { "type" : "quiz",

我的数据库中的示例记录如下所示:

{
    "_id" : 2,
    "name" : "Corliss Zuk",
    "scores" : [
            {
                    "type" : "exam",
                    "score" : 87.53859552156015
            },
            {
                    "type" : "quiz",
                    "score" : 24.49132971110967
            },
            {
                    "type" : "homework",
                    "score" : 99.24881912510654
            }
    ]
}

我正在尝试选择所有家庭作业分数>90或考试分数<50的记录。 我的身体状况是这样的:

 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或小于50的记录,但与正在检查的分数应为家庭作业分数或考试分数的条件无关。 我缺少一个条件,该条件将分数与类型关联,然后检查其值

任何帮助都将不胜感激

谢谢,
John

您目前正在有效地执行以下操作:

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
               }
            }
         }
      }
   ]
})

希望能有所帮助。

您目前正在有效地执行以下操作:

find({
   $or:[
      {
         'scores.type':"exam",
         'scores.score':{
            $lt:50
         }
      },
      {
         'scores.type':"homework",
         'scores.score':{
            $gt:90
         }
      }
   ]
})
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))));
这基本上是要求MongoDB返回任何元素具有类型“exam”且任何元素的分数高于50.0但不一定是同一元素的文档

您可以使用$elemMatch运算符针对同一元素测试多个条件。因此,与此类似的Java将实现以下功能:

find({
   $or:[
      {
         scores:{
            $elemMatch:{
               type:"exam",
               score:{
                  $lt:50
               }
            }
         }
      },
      {
         scores:{
            $elemMatch:{
               type:"homework",
               score:{
                  $gt:90
               }
            }
         }
      }
   ]
})
希望有帮助

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))));
这样使用它


这样使用。

这段代码到底是什么?@Prinzhorn Java,我认为示例记录是一个JSON片段,我的代码是Java,这不是比一般的MongoDB更像是一个Java/驱动程序问题吗?@Prinzhorn它仍然会出现在你的
MongoDB
标记列表中,所以我认为Java标记已经添加了,编辑这个问题很容易。这段代码到底是什么?@Prinzhorn Java,我认为示例记录是一个JSON片段,我的代码是Java,这不是比一般的MongoDB更像是一个Java/驱动程序问题吗?@Prinzhorn它仍然会出现在你的
MongoDB
标记列表中,所以我认为Java标记被添加了,编辑问题很容易。谢谢@attish。这正是我需要的。我有相同的查询,只是我在“type”前面加了scores.type,在“scores”前面加了scores.score.Thank@attish。这正是我需要的。我有相同的查询,除了我用scores.type作为“type”前缀,用scores.score作为“score”前缀。谢谢@Remon我使用了$elemMatch操作符,但需要与您提供的Java等价的东西。不过,感谢您用我的代码清楚地解释了这个问题。Java equiv只是像您刚才所做的那样使用DBObject构建上述内容。在中使用JSON/shell总是比较容易,因此对于与Java无关的问题,更多的人可以回答。感谢@Remon,我使用了$elemMatch操作符,但需要与您提供的Java等价的东西。不过,感谢您用我的代码清楚地解释了这个问题。Java equiv只是像您刚才所做的那样使用DBObject构建上述内容。在中使用JSON/shell总是比较容易,因此对于与Java无关的问题,更多的人可以回答。