将数组分组在MongoDB中

3
我一直在尝试创建一个字符串或数组的集合,但我的主要问题是由于其他数据的原因无法使用$unwind。 为了更清晰地说明,我将展示一个例子: 这是我的一些文档的部分内容:
{
    "key": [
      "a",
      "b",
      "c"
    ]
  },
  {
    "key": [
      "b",
      "d"
    ]
  },
  {
    "key": [
      "e"
    ]
  }

我希望获得一个类似于这样的数组:

{
  "keys": [
     "a", 
     "b",
     "c",
     "d",
     "e"
  ]
}

或者这样:
{
  "keys": [
     ["a"], 
     ["b"],
     ["c"],
     ["d"],
     ["e"]
  ]
}

我只需要唯一的值。

如果能使用$unwind和$addToSet就太容易了。但是如我之前所说,由于需要其他数据,我无法这么做。 我试着在$addToSet中使用$cond,但不知道如何遍历数组。

这个管道不起作用 ->

db.collection.aggregate([
  {
    "$group": {
      "_id": null,
      "keys": {
        "$addToSet": {
          "$concatArrays": [
            "$key",
            "$this"
          ]
        }
      },
      
    }
  }
])

也许是这样的:

可能会有这样的情况:

  {
    "$group": {
      "_id": null,
      "keys": {
        "$addToSet": {
          "$cond": {
            if: {
              "$gt": [
                {"$size": "$key"},
                1
              ]
            },
            then: "<SPLIT THE ARRAY IN THE AMOUNT OF ELEMENTS>",
            else: "$key"
          }
        }
      }
    }
  }

我尝试了这个,但它也不起作用。
db.collection.aggregate([
  {
    "$project": {
      "keys": {
        "$map": {
          "input": {
            "$range": [
              0,
              {
                "$size": "$key"
              },
              1
            ]
          },
          as: "index",
          in: {
            $slice: [
              "$key",
              "$$index",
              1
            ]
          }
        }
      }
    }
  },
  {
    "$group": {
      "_id": null,
      "keys": {
        "$addToSet": {
          "$concatArrays": [
            "$keys"
          ]
        }
      },
      
    }
  }
])

这是我的代码片段:https://mongoplayground.net/p/sMENXyrbQgI。能否有人指导一下我?非常感谢。

1个回答

2
所以,这个想法是使用$setUnion$reduce来从数组中选择唯一的值: 在MongoPlayground中的解决方案 尝试这个查询:
db.collection.aggregate([
    {
        $group: {
            _id: null,
            "keys": { $push: "$key" }
        }
    },
    {
        $addFields: {
            "keys": {
                $reduce: {
                    input: "$keys",
                    initialValue: [],
                    in: {
                        $setUnion: ["$$value", "$$this"]
                    }
                }
            }
        }
    }
])

输出:

{
    "_id" : null,
    "keys" : [
        "a",
        "b",
        "c",
        "d",
        "e"
    ]
}

collection中的测试数据:

[
    {
        "key": [
            "a",
            "b",
            "c"
        ]
    },
    {
        "key": [
            "b",
            "d",
            "a",
        ]
    },
    {
        "key": [
            "e",
            "b"
        ]
    }
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接