我的Collection 中有这样的文档 struct :

{
  "grades": [
        { "grade": "A", "score": 8 },
        {"grade": "A", "score": 7 }
    ]
}

我需要过滤这些文档,当它们的score除以7时,它有0作为提醒.原问题here(问题30).他们的解决方案很简单:

db.restaurants.find(
                  {"grades.score" :
                     {$mod : [7,0]}
                  },
                     {"restaurant_id" : 1,"name":1,"grades":1}
                );

然而,为了实践,我想自己解决,这并不工作.

db.restaurants.aggregate([
    {
        "$match": {
           "$expr": {"$in": [0,   [ { $mod: [ "$grades.score", 7 ] }    ]  ]}
        }
    },
])

错误是:

PlanExecutor error during aggregation :: caused by :: $mod only supports numeric types, not array and int

基本上,我想判断0是否在定制数组中,该数组在模运算后只包含单个值,如docs for $in在聚合中所解释的.

有没有一种方法可以使$mod个工作作为聚合的一部分?

我看到类似的问题被问了here个,但它只是指第一个分数在等级数组,而不是所有.因此,在我的例子中,我应该看到一开始给出的示例文档,因为7 % 7 = 0

推荐答案

使用$map函数对数组的每个值进行map的模结果,然后判断结果数组中是否存在0.

您可以使用其中之一:

db.restaurants.aggregate([
  {
    $set: {
      mods: {
        "$map": {
          "input": "$grades.score",
          "as": "score",
          "in": {
            $mod: ["$$score", 7]
          }
        }
      }
    }
  },
  {
    "$match": {
      "$expr": {
        "$in": [0, "$mods"]
      }
    }
  }
])

Mongo Playground

如果你想把它作为管道中的一个阶段:

db.restaurants.aggregate([
  {
    "$match": {
      "$expr": {
        "$in": [
          0,
          {
            "$map": {
              "input": "$grades.score",
              "as": "score",
              "in": {
                $mod: ["$$score", 7]
              }
            }
          }
        ]
      }
    }
  }
])

Mongo Playground

Mongodb相关问答推荐

MongoDB—基于数组中同一文档中的另一个字段更新字段

如何对嵌套在另一个数组中的数组中的字段执行查找?

在MongoDB中获取所有帖子时如何获取相关用户信息

获取响应周期中的特定键和值

MongoDB 对特定搜索查询的响应时间较长

Mongo 将一个数组链接到另一个数组

通过insertId MongoDB获取文档

如何修改 mongodb 中嵌套对象数组中的字段名称/键?

使用 Spring Boot >= 2.0.1.RELEASE 将 ZonedDateTime 保存到 MongoDB 时出现 CodecConfigurationException

MongoDB:按标签获取文档

MongoDB 查找精确的数组匹配,但顺序无关紧要

带有 Java 驱动程序的 MongoDB 聚合

如何使用 Pymongo 在 MongoDB 中 Select 单个字段?

MongoDB 中的多个 $inc 更新

从 mongo 结果中删除 _id

Mongodb $lookup 使用 _id 无效果

在 MongoDB 中快速搜索数十亿个小文档的策略

Lombok - java.lang.StackOverflowError:toString 方法上的 null

在 MongoDB 中比较日期(moment.js)

MissingSchemaError:Schema hasn't been registered for model