MongoDB 聚合查询以查找具有缺失值的文档

MongoDB Aggregate Query to find the documents with missing values

我有大量对象,其中存储了不同员工的数据。

{
  "employee": "Joe",
  "areAllAttributesMatched": false,
  "characteristics": [
    {
      "step": "A",
      "name": "house",
      "score": "1"
    },
    {
      "step": "B",
      "name": "car"
    },
    {
      "step": "C",
      "name": "job",
      "score": "3"
    }
  ]
}

有些情况下某个对象的分数完全缺失,我想从数据库中找出所有这些详细信息。 为了做到这一点,我编写了以下查询,但似乎我在某个地方出错了,因为它没有显示输出。

我希望此查询的数据为以下格式,以便很容易找出哪个员工缺少哪个步骤和哪个姓名的分数。

db.collection.aggregate([
  {
    "$unwind": "$characteristics"
  },
  {
    "$match": {
      "characteristics.score": {
        "$exists": false
      }
    }
  },
  {
    "$project": {
      "employee": 1,
      "name": "$characteristics.name",
      "step": "$characteristics.step",
      _id: 0
    }
  }
])

您需要使用$exists来检查是否存在

playground

您可以使用 $ifNull 来处理以下两种情况 1. score 字段缺失 2. score 为空。

db.collection.aggregate([
  {
    "$unwind": "$characteristics"
  },
  {
    "$match": {
      $expr: {
        $eq: [
          {
            "$ifNull": [
              "$characteristics.score",
              null
            ]
          },
          null
        ]
      }
    }
  },
  {
    "$group": {
      _id: null,
      documents: {
        $push: {
          "employee": "$employee",
          "name": "$characteristics.name",
          "step": "$characteristics.step",
          
        }
      }
    }
  },
  {
    $project: {
      _id: false
    }
  }
])

这里是Mongo playground供您参考。