MongoDB可以将多个字段添加到单个$ addToSet吗?

时间:2020-08-13 00:14:36

标签: mongodb aggregation-framework

说我有

user {
  _id: ObjId(..),
  name: "John Smith",
  computers: ["MSI desktop", "Mac Book"],
  phones: ["Pixel", "Galaxy"]
}

在下面的示例中,我尝试查找聚合中所有计算机和电话的不同值,但将其作为一个字段,如下所示:

db.user.aggregate([
    {
        $group: {
            _id: null, 
            "electronics": {$addToSet: ["$computers", "$phones"]}
        }
    },
])

上面显然是抛出了一个错误,所以我想知道是否有一种方法可以使用$addToSet

2 个答案:

答案 0 :(得分:2)

您可以使用as per Nico's answer to this more specific question for chrome运算符来获取出现在任何数组中的所有值:

db.user.aggregate([
    {
        $group: {
            _id: null, 
            "electronics": {$setUnion: ["$computers", "$phones"]}
        }
    },
])

目前无法对其进行测试,但是您必须完全获得所需的东西。

答案 1 :(得分:1)

$ unwind + $ addToSet + $ concatArrays:

db.test.insert({  name: "John Smith",
  computers: ["MSI desktop", "Mac Book"],
  phones: ["Pixel", "Galaxy"]
})

db.test.aggregate([
{$unwind:'$computers'},
{$unwind:'$phones'},
{$group: {_id: null, e: {$addToSet: '$computers'}, e2: {$addToSet: '$computers'}}},
{$project:{electronics:{$concatArrays:['$e','$e2']}}},
])


 { "_id" : null, "electronics" : [ "MSI desktop", "Mac Book", "MSI desktop", "Mac Book" ] }