【问题标题】:mongoDB selecting record based on two conditionsmongoDB根据两个条件选择记录
【发布时间】:2013-05-29 05:46:53
【问题描述】:

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

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

}

我正在尝试选择所有作业分数 > 90 或考试分数

 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 或

任何帮助将不胜感激。

谢谢, 约翰

【问题讨论】:

  • 这段代码到底是什么?
  • @Prinzhorn Java,我认为
  • 示例记录是 JSON sn-p,我的代码是 Java
  • 这不是一般意义上的 Java/驱动程序问题吗?
  • @Prinzhorn 它仍然会出现在您的 mongodb 标签列表中,所以嗯,但是添加了 java 标签,很容易编辑问题。

标签: java mongodb mongodb-java


【解决方案1】:
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))));

以这种方式使用它。

【讨论】:

  • 谢谢@attish。这正是我所需要的。我有相同的查询,除了我在'type'前面加上 scores.type 和在'score'前面加上 scores.score。
【解决方案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
               }
            }
         }
      }
   ]
})

希望对您有所帮助。

【讨论】:

  • 谢谢@Remon 我正在使用 $elemMatch 运算符,但需要与您提供的 Java 等价的运算符。感谢您清楚地解释我的代码的问题。
  • Java equiv 只是像您一样使用 DBObject 构建上述内容。对于与 Java 无关的问题,在 SO 中使用 JSON/shell 总是更容易,因此更多人可以回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多