如何从 Mongo 数据库中的子文档数组中删除与条件匹配的子文档

How to remove a subdocument matching a condition from an array of subdocuments in Mongo DB

我有一个 MongoDB 数据库,其中包含以下格式的文档:

  {
  "name": "",
  "surname": "",
  "ssn": "",
  "tests": [
    {
      "date": "",
      "attending": [
        {
          "id": "",
          "role": ""
        }
      ]
    }
  ]
}

一份文件包含每个人的测试列表及其相关信息。我只想从每个文档中删除在某个日期 (2019-02-22) 之后由某个护士 (id = 0187).

由于所有日期都以 string 格式保存,为了进行日期比较,我按以下方式使用了 $dateFromString 运算符:

db.Vaccinations.aggregate([
"$match": {
  "$expr": {
    "$and": [
      {
      "$gte": [
        { "$dateFromString": { "dateString": "$tests.date"}},
        ISODate("2019-02-22T00:00:00Z")
      ]},
      {
        "tests.attending.id" : "0187"
      }
    ]
    }
  }
]) 

但是我无法使用 $pull 运算符删除对应的子文档。是否可以这样做,或者 $pull 是错误的操作员?

查询

  • 从测试中只保留那些
    • date < "2019-02-22"
    • nurse != "0187"
      这样,通过测试必须在日期之前或由另一位护士完成。
  • 使用路径“$test.attending.id”检查
  • nurse != "0187" 以获取该测试的所有 ID(数组),并测试与 ["0187"] 的交集是否为空 = > 那个护士没有做测试。

*您可以根据需要使用 updateOne 或 updateMany

*如果日期具有相同的格式,我没有使用 $dateFromString YYYY-MM-DD 比较会起作用,但通常将日期保存在数据库中,这会使事情变得更容易和更快。

Test code here

update(
{},
[{"$set": 
   {"tests": 
     {"$filter": 
       {"input": "$tests",
        "cond": 
         {"$or": 
           [{"$lt": ["$$test.date", "2019-02-22"]},
            {"$eq": 
              [{"$setIntersection": [["0187"], "$$test.attending.id"]}, []]}]},
        "as": "test"}}}}])