2015-12-08 63 views
0

我需要獲取所有標籤,這些標籤存儲在數組中用於多個文檔。我可以選擇通過所有需要的文件:獲取mongodb文檔的多個數組並將它們合併爲唯一值

Collection.find({ 'metadata.tags': { $exists: true } }); 

第一文檔的數據可能看起來像

"metadata" : { 
    "type" : "photo", 
    "tags" : [ 
     "test", 
     "anything", 
     "something", 
     "more" 
    ] 
} 

第二個:

"metadata" : { 
    "type" : "photo", 
    "tags" : [ 
     "different", 
     "content", 
     "something", 
     "more" 
    ] 
} 

一些陣列中的元素都是複製。我只需要唯一的值,所以在這個例子中的結果將有六個元素。

我想大概是這樣的刪除重複:

var c = a.concat(b); 
var tags = c.filter(function (item, pos) { return c.indexOf(item) == pos; }); 
return tags; 

但我的第一個問題是如何讓所有陣列的訪問,這可能是更多的則只有兩個,因爲find()會給我多文檔。如何獲取所有文檔的數組併合並它們?

第二個問題是刪除重複項,因爲我的示例只適用於兩個數組。

更新

我會做這樣的事情:

var tags = []; 
    Media.find({ 'metadata.tags': { $exists: true } }).forEach(function(doc) { 
     tags = tags.concat(doc.metadata.tags); 
    }); 
    var result = tags.filter(function (item, pos) { return tags.indexOf(item) == pos; }); 
    return result; 

也許這可以優化...

回答

2

爲您解決,MongoDB中已經提供了我們一個distinct命令。像下面這樣使用它:

Collection.distinct('metadata.tags') 

上述命令將爲您提供數組中不同的值。不會有任何重複的元素。因此,你的第二個問題也將被解決

+0

它是否也是minimongo的一部分,因爲我使用流星? – user3142695

+0

我曾在貓鼬和mongodb本機驅動程序,都提供了不同的方法。通過谷歌搜索,我發現minimongo不支持不同的關鍵字。我也可以給你一個聚合查詢作爲解決方法,如果它確實支持聚合 –

+0

看到這個太http://stackoverflow.com/questions/14514733/does-meteor-have-a-distinct-query-for-collections –

相關問題