Javascript 获取多个mongodb文档数组,并将它们合并为唯一值

Javascript 获取多个mongodb文档数组,并将它们合并为唯一值,javascript,arrays,mongodb,meteor,array-merge,Javascript,Arrays,Mongodb,Meteor,Array Merge,我需要获取所有标记,这些标记存储在多个文档的数组中。我可以通过以下方式选择所有需要的文档: Collection.find({ 'metadata.tags': { $exists: true } }); 第一个文档的数据可能如下所示 "metadata" : { "type" : "photo", "tags" : [ "test", "anything", "something", "more" ] }

我需要获取所有标记,这些标记存储在多个文档的数组中。我可以通过以下方式选择所有需要的文档:

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;

也许这可以优化…

为了解决您的问题,mongoDB已经为我们提供了一个
distinct
命令。使用方法如下:

Collection.distinct('metadata.tags')

上面的命令将为您提供与数组不同的值。不会有任何重复的元素。因此,您的第二个问题也将得到解决

为了解决您的问题,mongoDB已经为我们提供了一个
distinct
命令。使用方法如下:

Collection.distinct('metadata.tags')

上面的命令将为您提供与数组不同的值。不会有任何重复的元素。因此,您的第二个问题也将得到解决

当我使用meteor时,它也是minimongo的一部分吗?我在mongoose和mongodb原生驱动程序中工作过,两者都提供了不同的方法。通过谷歌搜索,我发现minimongo不支持distinct关键字。我也可以给你一个聚合查询作为解决办法,如果它确实支持聚合的话。也请看这个。你觉得我的解决方案怎么样(请看更新的帖子)?我觉得很好,但是如果有大量的文档,它会导致性能问题,这也是minimongo的一部分,因为我使用meteor?我在mongoose和mongodb原生驱动程序中工作过,两者都提供了不同的方法。通过谷歌搜索,我发现minimongo不支持distinct关键字。我也可以给你一个聚合查询作为解决办法,如果它确实支持聚合的话。也请看这个。你觉得我的解决方案怎么样(请看更新的帖子)?我觉得很好,但如果文档数量巨大,它可能会导致性能问题