由于$lte和$gt在值为字符串格式时会进行字典比较,因此我尝试将值转换为int或double。但我没有得到预期的结果。对于这种情况,我希望查询执行到2,因为只有2个文档存在"0";userDL";字段值小于或等于5。请注意:我不能使用聚合,我必须使用db.collection.find(query(.count((。请在这里帮助我查询。
收藏内容:
{ "_id" : "14_0", "data" : [ { "dn" : "subdata=data_a", "userUL" : "0", "objectClass" : "NEWDATA", "userDL" : "5" } ] }
{ "_id" : "15_0", "data" : [ { "dn" : "subdata=data_b", "userUL" : "0", "objectClass" : "NEWDATA", "userDL" : "3" } ] }
{ "_id" : "16_0", "data" : [ { "dn" : "subdata=data_c", "userUL" : "0", "objectClass" : "NEWDATA", "userDL" : "9" } ] }
第一,我尝试了正常的查询,这给了我不支持的转换错误:
db.testcol.find({ $expr: { $lte: [ { $toDouble: "$data.userDL" }, 5 ] } }).count()
2020-09-18T06:26:37.010+0530 E QUERY [js] uncaught exception: Error: count failed: {
"ok" : 0,
"errmsg" : "Unsupported conversion from array to double in $convert with no onError value",
"code" : 241,
"codeName" : "ConversionFailure"
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DBQuery.prototype.count@src/mongo/shell/query.js:376:11
@(shell):1:1
我在下面的查询中修复了上面的错误,但我正在使用聚合。这在比较和输出真/假方面工作得很好。
db.testcol.aggregate([{ $project:{ adjustedGrades:{$map:{input: "$data.userDL",as: "grade",in: {$lte : [{ $toInt: "$$grade" },5] } }}}}])
{ "_id" : "14_0", "adjustedGrades" : [ true ] }
{ "_id" : "15_0", "adjustedGrades" : [ true ] }
{ "_id" : "16_0", "adjustedGrades" : [ false ] }
我尝试在find查询中使用上面的聚合,但要么我没有得到任何输出,要么输出错误(我得到的是3比2(
db.testcol.find({ $expr: { $lte: [ {$map:{input: "$data.userDL",as: "grade",in: { $toInt: "$$grade" } }} , 5 ] } })
no output here
db.testcol.find({$expr: {$map: {input: "$data.userDL",as: "grade",in: {$lte : [{ $toInt: "$$grade" },5] } }}}).count()
3
[更新]
> db.testcol.aggregate([{ $project:{ adjustedGrades:{$map:{input: "$data.userDL",as: "grade",in: {$lte : [{ $toInt: "$$grade" },5] } }}}}, {$match: {adjustedGrades: {$eq: true}}}])
{ "_id" : "14_0", "adjustedGrades" : [ true ] }
{ "_id" : "15_0", "adjustedGrades" : [ true ] }
我希望能够使用db.collection.find((来完成这项工作。有人能帮我吗?我实际上并不需要adjustedGrades字段。我想在做db.testcol.find(aggregateequery(时返回这两个文档。最后,我想能够做db.ttestcol.fund(aggregate equery(.count((。PS:我只能使用find((和count((。
使用$reduce
迭代数组并测试每个元素的示例:
db.collection.find({
$expr: {
$reduce: {
input: "$data",
initialValue: false,
in: {
$or: [
"$$value",
{$lte: [{$toDouble: "$$this.userDL"}, 5]}
]
}
}
}
})
游乐场
请注意,以这种方式使用$expr
将无法使用索引。
如果允许修改文档,则更新以使每个userDL
都是数字,将允许直接查询和索引该字段。
MongoDB Enterprise mongos> db.foo.insert({a:'20',b:[{c:'20'}]})
WriteResult({ "nInserted" : 1 })
MongoDB Enterprise mongos> db.foo.find({$expr:{$gte:[{$convert:{input:'$a',to:'int'}},30]}})
MongoDB Enterprise mongos> db.foo.find({$expr:{$gte:[{$convert:{input:'$a',to:'int'}},3]}})
{ "_id" : ObjectId("5f64632b24059b0e3ee998b8"), "a" : "20", "b" : [ { "c" : "20" } ] }
这应该有效:
db.getCollection("myCollection"(.fund({quot;data.0.userDL":{$lte:"5"},{}(.count((