如何解决错误:在find中使用expr时,“表示表达式的对象必须恰好具有一个字段”
我对db.dummy.find(query).count()
的输出应为 2 ,但出现以下错误。
请注意,“标记”字段位于数组中,并且具有“字符串值”,因此使用$map
,因为对数组使用$convert
会引发转换错误。
db.dummy.find({
$expr: {
$project: {
adjustedGrades: {
$map: {
input: "$data.mark",as: "grade",in: {
$lte: [
{
$toInt: "$$grade"
},5
]
}
}
}
},$match: {
adjustedGrades: {
$eq: true
}
}
}
}).count()
错误:
error: {
"ok" : 0,"errmsg" : "An object representing an expression must have exactly one field: { $project: { adjustedGrades: { $map: { input: \"$data.mark\",as: \"grade\",in: { $lte: [ { $toInt: \"$$grade\" },5.0 ] } } } },$match: { adjustedGrades: { $eq: true } } }","code" : 15983,"codeName" : "Location15983"}
集合:
{ "_id" : "1_0","data" : [ { "Class" : "DUMMY1","mark" : "5" } ] }
{ "_id" : "2_0","data" : [ { "Class" : "DUMMY2","mark" : "3" } ] }
{ "_id" : "3_0","data" : [ { "Class" : "DUMMY3","mark" : "9" } ] }
解决方法
在mongoDB社区的帮助下,我能够获得在数组中转换和比较值的解决方案,该数组可以在db.collection.find()而不是aggregate()中使用。
>db.testcol.find({
"$expr": {
"$allElementsTrue": {
"$map": {
"input": "$data","as": "d","in": {
"$gt": [
{
"$toDouble": "$$d.userDL"
},5
]
}
}
}
}
})
Output: 2
,
从MongoDB文档中,
$ expr: 允许在查询语言中使用聚合表达式。
$ expr具有以下语法:
{ $expr: { <expression> } }
参数可以是任何有效的聚合expression。有关更多信息,请参见Expressions。
$project
不能在$expr
内使用
为了实现用例,可以使用聚合框架:
db.dummy.aggregate([
{
$project: {
adjustedGrades: {
$map: {
input: "$data",as: "grade",in: {
$lte: [
{
$toInt: "$$grade.mark"
},5
]
}
}
}
}
},{
$match: {
adjustedGrades: {
$eq: true
}
}
},{
"$count": "count"
}
])
MongoDB Playground:Using aggregate()
如果您不想使用聚合框架,请尝试以下方法:
首先使用parseInt()将字符串转换为Int:
db.dummy.find().forEach(function(doc) {
doc.data.forEach(function(d) {
d.mark=parseInt(d.mark); })
db.dummy.save(doc);
})
然后运行find()查询:
db.dummy.find({
"data.mark": {
$lte: 5
}
}).count()
,
这应该有帮助
db.getCollection(“ dummy”)。find({“ data.0。mark”:{$ lte:“ 5”}},{})
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。