【问题标题】:Perform search with facets unknown upfront Atlas MongoDB使用预先未知的方面执行搜索 Atlas MongoDB
【发布时间】:2023-01-11 03:57:53
【问题描述】:

我在 MongoDB 中有以下文档结构:

{
  // other keys,
  tags: [
    tagA: "red",
    tagB: "green"
  ]
},
{
  // other keys,
  tags: [
    tagA: "orange",
    tagB: "green",
    tagC: "car"
  ]
}

我想执行 $facets 搜索,得到以下输出(每个标签的名称 + 该标签上出现的值 + 这些值的计数):

{
  [
    tagA: {
      red: 1,
      orange: 1
    },
    tagB: {
      green: 2
    },
    tagC: {
      car: 1
    }
  ]   
}

棘手的部分是这些方面是预先未知的(它们可能会有所不同),而且我发现的每个教程都只适用于一组预定义的方面。

是否可以?

P.S.:如何让这个输出与给定的查询一起出现?所以回报是这样的:

{
  queryResults: [all the results, as in a normal query],
  facets: [result showed in accepted answer]
}

【问题讨论】:

  • 只是根据给定的方面动态构建查询文档?
  • 不明白你的意思

标签: mongodb aggregation-framework faceted-search


【解决方案1】:

如果您考虑将其作为输入(我在数组中的对象周围添加了括号):

[
  {
    tags: [
      {
        tagA: "red"
      },
      {
        tagB: "green"
      }
    ]
  },
  {
    tags: [
      {
        tagA: "orange"
      },
      {
        tagB: "green"
      },
      {
        tagC: "car"
      }
    ]
  }
]

然后你可以做一个聚合管道如下:

db.collection.aggregate([
  {
    "$unwind": "$tags"
  },
  {
    "$addFields": {
      "kv": {
        "$objectToArray": "$tags"
      }
    }
  },
  {
    "$unwind": "$kv"
  },
  {
    "$group": {
      "_id": {
        key: "$kv.k",
        value: "$kv.v"
      },
      "count": {
        "$sum": 1
      }
    }
  },
  {
    "$group": {
      "_id": "$_id.key",
      "value": {
        "$push": {
          "k": "$_id.value",
          "v": "$count"
        }
      }
    }
  },
  {
    $project: {
      val: [
        {
          k: "$_id",
          v: {
            "$arrayToObject": "$value"
          }
        }
      ]
    }
  },
  {
    $project: {
      res: {
        "$arrayToObject": "$val"
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: "$res"
    }
  }
])

它会给你这个结果:

[
  {
    "tagA": {
      "orange": 1,
      "red": 1
    }
  },
  {
    "tagB": {
      "green": 2
    }
  },
  {
    "tagC": {
      "car": 1
    }
  }
]

你可以在 mongoplayground 上看到这个:https://mongoplayground.net/p/FZbM-BGJRBm 希望这能回答你的问题。

【讨论】:

  • 伙计,简直不敢相信它奏效了!非常感谢你!从昨天开始我花了很多时间试图弄清楚,但直到现在都没有运气。上帝祝福你!如果有什么我可以为你做的作为回报,请告诉我。
  • 还有一件事:如何获得给定查询的结果以及您刚刚显示的结果?上面在 p.s. 中有详细解释。在这个问题中
猜你喜欢
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多