我想使用以下字段在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"
}
如何编写查询以实现正在寻找的内容...谢谢!
答案 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)
让我们检查一下您的文档结构如下rate
和hrs
的数量
{ "_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
}
}]
}]
}
})