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