【问题标题】:MongDB: Query to extract dynamic key, value pair from nested documentsMongoDB:查询以从嵌套文档中提取动态键、值对
【发布时间】:2020-07-05 18:05:49
【问题描述】:

以下是我的数据结构,我需要提取“发布者”动态键并将 ($lookup) 与另一个集合进行比较以匹配记录,对 % 值求和。

 "_id" : ObjectId("5eff1e9a9bb60729d3278140"),
    "tracks" : [ 
        {
            "_id" : ObjectId("5efd9548327f5509b009b5a9"),
            "artist" : ["abc"],
            "genre" : "Pop",
            "publishers" : {
                "a" : "30.00%",
                "b" : "30.00%",
                "c" : "30.00%",
                "d" : "10.00%"
            },
            "__v" : 0
        }
  1. 数据结构有效吗?
  2. 我正在尝试将其转换为 $ObjectToArray 但无法转换嵌套文档,有什么建议吗?

【问题讨论】:

    标签: mongodb mongoose mongodb-query


    【解决方案1】:

    您可以使用此聚合管道。它会将您在 publishers 数组中的 动态键 转换为以下形式的对象,之后您可以轻松地应用您的 $lookup 阶段。

      {
        "_id": ObjectId("5eff1e9a9bb60729d3278140"),
        "percentage": 30,
        "publisher": "b"
      }
    

    db.collection.aggregate([
      {
        $unwind: "$tracks"
      },
      {
        $project: {
          publisher: {
            $objectToArray: "$tracks.publishers"
          }
        }
      },
      {
        $unwind: "$publisher"
      },
      {
        $project: {
          publisher: "$publisher.k",
          percentage: {
            $convert: {
              input: {
                $trim: {
                  input: "$publisher.v",
                  chars: "%"
                }
              },
              to: "double"
            }
          }
        }
      }
    ])
    

    MongoDB Playground Ex. - 1


    更新示例

    MongoDB Playground Ex. - 2

    【讨论】:

    • 首先非常感谢您的回复,我能够得到预期的结果。我可以再与您确认一件事吗,请在此处找到我的查询“mongoplayground.net/p/bnGSqbl92bZ”并建议我,这是推荐的方法吗?
    • 在看到上面的数据库结构后,我添加了另一个示例。您可以根据需要修改此查询。
    • 感谢您提供示例,看起来您更改了给定的数据结构,它适用于您的数据结构,而不是我的。请找到实际结构,并希望将结果集作为曲目详细信息以及总贡献(每个匹配发布者百分比的总和)和指标标志真/假(真 = 100%,假 100%)。完整的数据结构:“mongoplayground.net/p/Z-qNt6IWhg7
    • 这完全偏离了实际问题本身,您需要发布另一个问题并解释您想要实现的目标
    • 实际问题已经发布,并且给定的解决方案与提供的数据结构不同,因此我试图让解决方案使其适用于四个单独的集合而不是单个嵌套集合,请指教。
    猜你喜欢
    • 2018-03-09
    • 2021-02-25
    • 2016-08-16
    • 2023-03-08
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多