簡體   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