在mongo DB中编写复杂查询

时间:2015-08-04 18:12:24

标签: mongodb

我想使用以下字段在mongodb中编写复杂查询:

  • 小时

查询应该根据以下条件返回结果集:

1)class = "a" && rate > "20000"

OR

2)class = "b" && (rate X hrs X 52) > "20000"

我尝试查询的集合中的记录看起来像这样:

{
    "_id": "3434sfsf",
    "rate": "60",
    "class": "a"
},
{
    "_id": "sdsdsd",
    "rate": "60",
    "class": "b",
    "hrs": "8"
}

如何编写查询以实现正在寻找的内容...谢谢!

2 个答案:

答案 0 :(得分:4)

请尝试以下查询:

第1步:我们只过滤那些带有“class”的文档:“a”或“class”:“b”和“hrs”键存在

第2步:我们正在将“rate”,“hrs”与52相乘并将结果存储在“ rateMultiply ”键中

第3步:我们按照以下标准过滤文档: class =“a”&&率> “20000”OR class =“b”&& (费率X小时X 52)> “20000”

第4步:我们只显示我们需要的那些字段的documnet。

让我们创建一个集合“ exp4 ”并插入以下文档:

db.exp4.insert({ "_id" : "3434sfsf", "rate" : 60, "class" : "a" });
db.exp4.insert({ "_id" : "sdsdsd", "rate" : 60, "class" : "b", "hrs" : 8 });
db.exp4.insert({ "_id" : "123", "rate" : 30000, "class" : "a", "hrs" : 8 });
db.exp4.insert({ "_id" : "12567", "rate" : 12000, "class" : "b" });

现在让QUERY收集:

db.exp4.aggregate([
     { $match: 
       {$or : [ {"class" : "a"},
                {$and : [{"class":"b"},{"hrs": {"$exists" : 1}}]}
              ]
       }
     },
     { $project : 
        { rateMultiply : { $multiply: ["$rate","$hrs",52]}, 
         rate:1, class:1, hrs : 1 
        } 
     },
     { $match : 
       {$or : [ 
                { $and : [ {"class" : "a"} , 
                           {"rate" : {"$gt" : 20000}} 
                         ] 
                } , 
                { $and : [ {"class" : "b"}, 
                           {rateMultiply: {$gt:20000}}
                         ]
                 } 
               ] 
       }
     },
     { $project: {class : 1 , rate : 1 , hrs : 1 }
     }
  ])

结果:

{ "_id" : "sdsdsd", "rate" : 60, "class" : "b", "hrs" : 8 }
{ "_id" : "123", "rate" : 30000, "class" : "a", "hrs" : 8 }

答案 1 :(得分:1)

让我们检查一下您的文档结构如下ratehrs的数量

{ "_id" : ObjectId("55c105d097658f88b5a2979e"), "rate" : 60, "class" : "a" }
{ "_id" : ObjectId("55c105d097658f88b5a2979f"), "rate" : 60, "class" : "b", "hrs" : 8 }
{ "_id" : ObjectId("55c105d097658f88b5a297a0"), "rate" : 30000, "class" : "a", "hrs" : 8 }
{ "_id" : ObjectId("55c105d097658f88b5a297a1"), "rate" : 3000, "class" : "b", "hrs" : 8 }

然后,您首先应使用rate and hrs $mulitiply分别计算aggregation and multiplication的乘法,并使用参数rate,hrs and 52来计算乘法值,如下所示:

db.collectionName.aggregate({
"$project": {
    "multiply": {
        "$multiply": ["$rate", "$hrs", 52]
    },
    "rate": 1,
    "class": 1
}
})

所以文件看起来像:

{ "_id" : ObjectId("55c105d097658f88b5a2979e"), "rate" : 60, "class" : "a", "multiply" : null }
{ "_id" : ObjectId("55c105d097658f88b5a2979f"), "rate" : 60, "class" : "b", "multiply" : 24960 }
{ "_id" : ObjectId("55c105d097658f88b5a297a0"), "rate" : 30000, "class" : "a", "multiply" : 12480000 }
{ "_id" : ObjectId("55c105d097658f88b5a297a1"), "rate" : 3000, "class" : "b", "multiply" : 1248000 }

包含新密钥multiply现在在multiply $match使用$or and $and,如下所示:

db.collectionName.aggregate({
    "$project": {
        "multiply": {
            "$multiply": ["$rate", "$hrs", 52]
        },
        "rate": 1,
        "class": 1
    }
}, {
    "$match": {
        "$or": [{
            "$and": [{
                "class": "a"
            }, {
                "rate": {
                    "$gt": 20000
                }
            }]
        }, {
            "$and": [{
                "class": "b"
            }, {
                "multiply": {
                    "$gt": 20000
                }
            }]
        }]
    }
})