说我有
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
。
答案 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" ] }