繁体   English   中英

MongoDB 罗盘:如何过滤 MongoDB 文档中的嵌入式数组 object

[英]MongoDB Compass: How to filter embedded array object in the MongoDB document

我想根据 importkeyid 和 MissingPersonIds.PhotoId 数组字段过滤文档。 MissingPersonIds.PhotoId 上的过滤器应该像“sql -like ”运算符一样工作。

架构:

[{
  "_id": {
    "$oid": "61ada7da9a30fd8471869bbc"
  },
  "ImportKeyId": 5843,
  "Name" : "AV"
  "MissingPersonIds": [
    {
      "PhotoId": "2 - Copy.jpg",
      "Description": "Account ID not found"
    },
    {
      "PhotoId": "2 - Copy - Copy.jpg",
      "Description": "Account ID not found"
    },
    {
      "PhotoId": "2 - Copy - Copy (2).jpg",
      "Description": "Account ID not found"
    },
    {
      "PhotoId": "202020 - Copy (2).jpg",
      "Description": "Account ID not found"
    },
    {
      "PhotoId": "202020 - Copy - Copy.jpg",
      "Description": "Account ID not found"
    },
    {
      "PhotoId": "202020 - Copy - Copy (2).jpg",
      "Description": "Account ID not found"
    }
  ]
},
{
  "_id": {
    "$oid": "619cd7d2181999c9a4da790a"
  },
  "ImportKeyId": 5753,
  "Name" : 'av1'
  "MissingPersonIds": [
    {
      "PhotoId": "94578.jpg",
      "Description": "Photo id is not found"
    },
    {
      "PhotoId": "371426759.jpg",
      "Description": "Photo id is not found"
    }
  ]
}
.
.
.
]

基于以下条件: 在此处输入图像描述

过滤器: { "ImportKeyId": 5843 }

投影: { MissingPersonIds: { $slice:[0,5] }, "MissingPersonIds": { $elemMatch: { PhotoId: { $regex: /202020 /i } } } }

我期待低于 output 但 $elemMatch 只返回一个匹配的记录

[{
  "_id": {
    "$oid": "61ada7da9a30fd8471869bbc"
  },
  "ImportKeyId": 5843,
  "Name" : "AV"
  "MissingPersonIds": [  
    {
      "PhotoId": "202020 - Copy (2).jpg",
      "Description": "Account ID not found"
    },
    {
      "PhotoId": "202020 - Copy - Copy.jpg",
      "Description": "Account ID not found"
    }
  ]
}]

我应该用什么代替$elemMatch

也许是这样

db.collection.aggregate([
  {
    "$match": {
      "ImportKeyId": 5843
   }
  },
 {
"$project": {
  "_id": 1,
  "ImportKeyId": 1,
  MissingPersonIds: {
    $filter: {
      input: "$MissingPersonIds",
      as: "item",
      cond: {
        $gt: [
          {
            $indexOfCP: [
              {
                $toLower: "$$item.PhotoId"
              },
              "202020 "
            ]
          },
          -1
        ]
      }
    }
  }
  }
  }
 ])

Output:

[
  {
    "_id": ObjectId("61ada7da9a30fd8471869bbc")
    "ImportKeyId": 5843,
    "MissingPersonIds": [
  {
    "Description": "Account ID not found",
    "PhotoId": "202020 - Copy (2).jpg"
  },
  {
    "Description": "Account ID not found",
    "PhotoId": "202020 - Copy - Copy.jpg"
  },
  {
    "Description": "Account ID not found",
    "PhotoId": "202020 - Copy - Copy (2).jpg"
  }
  ],
 
  }
]

解释:

  1. 在匹配阶段,您只过滤具有 ImportKeyId: 5843 的文档
  2. 在项目阶段,您更适合 _id 和 ImportKeyId,并添加新字段 MissingPersonIds,它将过滤数组中仅包含字符串的元素,例如 SQL 中包含“%202020 %”的字符串

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM