mongodb: 匹配数组字段中没有子串的文档

mongodb: match documents without substring in array field

我正在尝试在聚合管道中匹配数组字段中没有子字符串的文档。

我认为我需要添加一个字段,然后在 -1 上执行 $match,但我被困在 $indexOfBytes 上以在数组字段中查找子字符串。

db.collectionName.aggregate([{$addFields:{indexOfA:{$indexOfBytes:['$arrayName.fieldName1.fieldName2','A']}}}])

我收到错误:

MongoServerError: PlanExecutor error during aggregation :: caused by :: $indexOfBytes requires a string as the first argument, found: array

集合示例:

[
  { arrayName: [ fieldName1: { fieldName2: 'A' } ] },
  { arrayName: [ fieldName1: { fieldName2: 'B' } ] },
  { arrayName: [ fieldName1: { fieldName2: 'C' } ] },
  { arrayName: [ ] }
]

想要的结果 (:

[
  { arrayName: [ fieldName1: { fieldName2: 'B' } ] },
  { arrayName: [ fieldName1: { fieldName2: 'C' } ] },
  { arrayName: [ ] }
]

也许是这样的:

db.collection.aggregate([
{
 $addFields: {
  arrayName: {
    "$filter": {
      "input": "$arrayName",
      "as": "a",
      "cond": {
        $eq: [
          {
            $indexOfBytes: [
              "$$a.fieldName1.fieldName2",
              "A"
            ]
          },
          -1
        ]
      }
     }
    }
   }
  },
  {
   $match: {
    $expr: {
     $ne: [
       {
         $size: "$arrayName"
       },
       0
     ]
    }
   }
  }
 ])

解释:

  1. $filter arrayName 元素在 fieldName2 中没有 A
  2. $仅匹配 non-empty arrayName 数组

playground