如何在$ filter中使用多个条件

时间:2018-03-29 22:48:57

标签: node.js mongodb

以下是我的mongoDB数据

OnClickListener

我想要显示那些数字大于(或等于)两个科目的学生数量超过(或等于)的学生的详细信息。例如,数学分数以及 Sci分数大于89的学生。我能够找到一个主题,但不能超过一个。以下是

的代码
 {
                        "_id": "SG01",
                        "name": "Pawan",
                        "marks": [
                            {
                                "English": 93,
                                "Maths": 90,
                                "Hindi": 89,
                                "Sci": 98
                            }
                        ],
                        "__v": 0
                    }

      {
                        "_id": "SG02",
                        "name": "Dravid",
                        "marks": [
                            {
                                "English": 40,
                                "Maths": 67,
                                "Hindi": 56,
                                "Sci": 45
                            }
                        ],
                        "__v": 0
                    }
      {
                        "_id": "SG03",
                        "name": "Kartik",
                        "marks": [
                            {
                                "English": 65,
                                "Maths": 77,
                                "Hindi": 80,
                                "Sci": 79
                            }
                        ],
                        "__v": 0
                    } 

我尝试了 $和但未能获得结果。任何帮助将不胜感激。

修改 这就是我正在做的事情..在Robo Mongo上,find()部分运行顺畅 但是当我试图使用POSTMAN ...

返回文档时
   {

det.aggregate([
  {
     $project: {
       _id:0,name:1,
        marks:[ {
           $filter: {
              input: "$marks",
              as:"mark",
        cond: { $gte: [ "$$mark.Maths",89]}
           }
        }]
     }
  }
],function(err,data){
  if(err)
  res.json({message:err});
  else {
    res.json({data:data});
  }
})


   }

没有消息就给出了错误然后我试图在控制台上获得o / p.below是错误

det.find({ marks:{ $elemMatch:{ Maths: { $gt :20 ,$lt :90}}}},function(err,data){
console.log(err,data)
    if(err)
        res.json({err});
    else {
        res.json({data});
    }
  })

2 个答案:

答案 0 :(得分:0)

您必须使用$ elemMatch运算符

db.collection.find({ "marks": { "$elemMatch": { "Math": {"$gt":70, "$lt":100}, "Sci": 79 }}})

答案 1 :(得分:0)

我不确定为什么"标记"是模式中的一个数组,因为它只有{subject:grade}个字段的一个元素,但是对于那个确切的模式,您可以这样查询(在$expr中至少需要3.6才能使用find

db.det.find({$expr:{$gt:[
    {$size: {$filter:{
        input:{$objectToArray:{$arrayElemAt:["$marks",0]}}, 
        cond:{$gt:["$$this.v", 89]} 
    }}},
    0
]}})