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

发布于 2025-01-20 06:20:07 字数 975 浏览 0 评论 0原文

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

我相信我需要添加一个字段,然后在 -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: [ ] }
]

I'm trying to match documents without a substring in an array field, in an aggregation pipeline.

I believe I need to add a field and then do a $match on -1, but I'm stuck on $indexOfBytes to find substrings in an array field.

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

I get the error:

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

collection example:

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

desired result (:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

季末如歌 2025-01-27 06:20:07

也许是这样的东西:

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
  2. $仅匹配非空数arrayname arrays

游乐场

Maybe something like this:

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

Explained:

  1. $filter arrayName elements not having A in fieldName2
  2. $match only the non-empty arrayName arrays

playground

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文