【问题标题】:How to find matching elements from an array of objects using mongoDB query如何使用 mongoDB 查询从对象数组中查找匹配元素
【发布时间】:2020-12-22 14:07:08
【问题描述】:

我想查找与产品“bat”匹配的所有元素。我的数据库结构如下

[
  {
    "key": 1,
    "productArray" : [
      {
         "requirementId": 5,
         "product": "bat"
      },
      {
        "requirementId": 6,
        "product": "Pen"
      },
     ]
  },
  {
    "key": 2
  },
  {
    "key": 3,
    "productArray": [
      {
        "requirementId": 1,
        "product": "bat"
      },
      {
        "requirementId": 2,
        "product": "Pen"
      },
      {
        "requirementId": 3,
        "product": "bat"
      },
      {
        "requirementId": 4,
        "product": "bat"
      }
    ]
  }
]

我已尝试以下查询,但此查询仅返回一个匹配元素。

db.collection.find({"key": 3}, {"productArray": {"$elemMatch": { "product": "bat"}}})

以上查询结果如下

[
 {
    "_id": ObjectId("5a934e000102030405000002"),
    "productArray": [
      {
        "product": "bat",
        "requirementId": 1
      }
    ]
 }
]

我可以使用 mongodb 查询获得预期的问题输出吗?或者我应该使用另一种方法来解决我的问题:

我的预期输出如下

[
  {
    "productArray": [
    {
      "requirementId": 1,
      "product": "bat"
    },
    {
      "requirementId": 3,
      "product": "bat"
    },
    {
      "requirementId": 4,
      "product": "bat"
    }
    ]
 }
]

【问题讨论】:

    标签: arrays database mongodb object find


    【解决方案1】:

    如您所见,$elemMatch$ 都是 惰性运算符,并返回匹配的第一个元素。

    您可以在 find (mongoDB 4.4+) 中添加管道,但更好地支持聚合:

    db.collection.aggregate({
      $match: {
        key: 3
      }
    },
    {
      $project: {
        productArray: {
          "$filter": {
            "input": "$productArray",
            "as": "p",
            "cond": {
              $eq: [
                "$$p.product",
                "bat"
              ]
            }
          }
        }
      }
    })
    

    Live version

    【讨论】:

    • 你好@minsky 在这种情况下,我得到了一个数组的所有元素,我只需要其中的 3 个
    • 感谢您的回答,请通过告诉我如何应用正则表达式来匹配字符串@minsky 来提供更多帮助
    • @TusharKale 将 /bat/i 的“bat”替换为不敏感。不要做“/bat/i”,只要/bat/i
    • 我的意思是如果我搜索为“bA”,它应该提供相同的结果。感谢您的回答@Minsky
    • @TusharKale 询问如何编写正则表达式是另一个问题。正则表达式遵循此语法/regexHere/。不过,这应该可以工作:/ba[t]/i/b[at]/i 取决于您想要多少灵活性。
    猜你喜欢
    • 2013-08-10
    • 1970-01-01
    • 2017-08-22
    • 2018-04-04
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2023-03-04
    相关资源
    最近更新 更多