Arrays 错误:";表示表达式的对象必须只有一个字段;在find()中使用expr时
我的Arrays 错误:";表示表达式的对象必须只有一个字段;在find()中使用expr时,arrays,mongodb,mongodb-query,aggregation-framework,Arrays,Mongodb,Mongodb Query,Aggregation Framework,我的db.dummy.find(query).count()的输出应该是2,但是我得到了以下错误 请注意,“标记”字段位于数组中,并且具有“字符串值”,因此使用了$map,因为对数组使用$convert会引发转换错误 db.dummy.find({ $expr: { $project: { adjustedGrades: { $map: { input: "$data.mark", as: &qu
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文档中 $expr: 允许在查询语言中使用聚合表达式 $expr具有以下语法:
{ $expr: { <expression> } }
如果不想使用聚合框架,请尝试以下方法:
首先使用parseInt()将字符串转换为Int:
然后运行find()查询:
这应该会有所帮助
db.getCollection(“dummy”).find({“data.0.mark”):{$lte:“5”},{})
在mongoDB社区的帮助下,我获得了一个解决方案,可以在db.collection.find()而不是aggregate()中使用数组中的值进行转换和比较
嗨,Tiya,我希望能够使用find()而不是aggregate()实现这一点。我已经阅读了文档,据我所知,我认为使用$expr应该是可能的,但我不知道如何使用。如果我错了,请纠正我。我已经更新了答案。您只需使用以下查询即可完成此操作,而无需使用$expr:
db.dummy.find({“data.mark”):{$lte:“5”}.count()
>db.dummy.find({“data.mark”):{$lte:“10”}.count()。当我检查$lte:10时,它给出了输出0,因为它进行了字典式的转换。因此,转换是必要的。另外,由于字段位于数组中,普通$convert将不起作用,因此它会引发转换错误。所以$diswind with$match或$map with$match可以完成这项工作,但我希望能够使用find()完成这项工作,而不是使用$exprYes进行聚合(),你是对的!转换是必要的。我已经更新了答案,使用ParseInt()进行转换,然后运行find()查询。是否可以在find()本身中执行ParseInt()和$lte,而不修改数据?查询应该仅为查找正确的文档而进行转换,而不是实际修改文档。我不一定要在原始查询中使用$project或添加新字段。只是,在find()本身中,转换和比较应该出现,并且应该返回相应的文档。
db.dummy.aggregate([
{
$project: {
adjustedGrades: {
$map: {
input: "$data",
as: "grade",
in: {
$lte: [
{
$toInt: "$$grade.mark"
},
5
]
}
}
}
}
},
{
$match: {
adjustedGrades: {
$eq: true
}
}
},
{
"$count": "count"
}
])
db.dummy.find().forEach(function(doc) {
doc.data.forEach(function(d) {
d.mark=parseInt(d.mark); })
db.dummy.save(doc);
})
db.dummy.find({
"data.mark": {
$lte: 5
}
}).count()
>db.testcol.find({
"$expr": {
"$allElementsTrue": {
"$map": {
"input": "$data",
"as": "d",
"in": {
"$gt": [
{
"$toDouble": "$$d.userDL"
},
5
]
}
}
}
}
})
Output: 2