2017-05-30 60 views
1

我有这样多场不同的聚合MongoDB中

{ name: 'John', likes: ['reading', 'cars'], dislikes: ['trees', 'cats']}, 
{ name: 'Ally', likes: ['drawing', 'cars'], dislikes: ['people', 'cats']}, 
{ name: 'Michelle', likes: [], dislikes: ['trees', 'cats']}, 

一些文件,我想聚集来回报每场的所有唯一值,这样

​​

注意,name字段不是一个数组,其他的都是,并不是所有的文档都包含了一些数组,如米歇尔谁没有likes。我用$ unwind尝试了几个$ group方法,要么没有正确包含所有的名字(100个唯一的名字,但只返回10个),要么由于某些文件没有包含像'likes'这样的字段而导致混乱。整天绞上我的大脑,感谢您的帮助。

回答

2

一个$group$addToSet所有键:

db.collection.aggregate([ 
    { "$unwind": { "path": "$likes", "preserveNullAndEmptyArrays": true } }, 
    { "$unwind": { "path": "$dislikes", "preserveNullAndEmptyArrays": true } }, 
    { "$group": { 
    "_id": null, 
    "name": { "$addToSet": "$name" }, 
    "likes": { "$addToSet": "$likes" }, 
    "dislikes": { "$addToSet": "$dislikes" } 
    }}, 
    { "$project": { 
    "_id": 0, 
    "name": { 
     "$filter": { 
     "input": "$name", 
     "as": "el", 
     "cond": { "$ne": [ "$$el", null ] } 
     } 
    }, 
    "likes": { 
    "$filter": { 
     "input": "$likes", 
     "as": "el", 
     "cond": { "$ne": [ "$$el", null ] } 
     } 
    }, 
    "dislikes": { 
    "$filter": { 
     "input": "$dislikes", 
     "as": "el", 
     "cond": { "$ne": [ "$$el", null ] } 
     } 
    } 
    }} 
]) 

使用,如果你真的必须$project$filter删除null值;