【问题标题】:How to search an array of objects in mongoDB without using aggregate query?如何在不使用聚合查询的情况下搜索 mongoDB 中的对象数组?
【发布时间】:2022-11-18 16:16:44
【问题描述】:

我们有一个用例,其中数据以以下格式存储

[
  {
    "Name": [
      {
        "KM": "2"
      },
      {
        "Weld Joint Number": "JN2"
      },
      {
        "Status": "Accepted"
      },
      {
        "Upstream": "PP1"
      },
      {
        "Downstream": "PP2"
      }
    ]
  },
  {
    "Name": [
      {
        "Pipe No": "PP5731A-08"
      },
      {
        "Km": "1"
      },
      {
        "Section Length (m)": "12.22"
      }
    ]
  }
]

我们正在检查是否需要使用与该对象数组中的值的搜索条件匹配的查找查询(无聚合)来搜索记录。 在搜索场景中,该值可以匹配数组中的任意值。

【问题讨论】:

  • 为什么你不想使用聚合?如果你能给出一个你需要的例子,以及json中的预期输出,如果你有很多不同的键,也许你可以使用{"type" : "status" , "value" : "Accepted"},这样数组内部的模式就相似了
  • 你在展示样品吗收藏或出现在文档
  • 聚合似乎是这里工作的正确工具。但是对之前的澄清问题+1
  • 嘿,@rickhg12hs 我们只在文档中显示数组,而不是集合。
  • @Takis,我们正在使用 mongoose paginate(带查找查询),它默认为我们提供分页概念。例如:var options = { limit: 20, page: 1 } collection.paginate(matchQuery, options) 如果我们使用聚合,我们需要明确指定 Skip 和 Limit 管道以使用分页概念,这可能会影响性能。

标签: mongodb mongodb-query


【解决方案1】:

这是 find 文档的一种方法,它在嵌套在数组中的对象中具有给定的单个值。

db.collection.find({
  "$expr": {
    "$in": [
      // search value goes here
      "Accepted",
      { // this puts all the values into a flat array
        "$reduce": {
          // instead of "stuff", use the field name of the array
          "input": "$stuff.Name",
          "initialValue": [],
          "in": {
            "$concatArrays": [
              "$$value",
              {
                "$map": {
                  "input": "$$this",
                  "as": "elem",
                  "in": {
                    "$getField": {
                      "field": "v",
                      "input": {"$first": {"$objectToArray": "$$elem"}}
                    }
                  }
                }
              }
            ]
          }
        }
      }
    ]
  }
})

试试mongplayground.net

【讨论】:

    猜你喜欢
    • 2020-07-27
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多