获取 mongodb 个文档的多个数组并将它们合并以获得唯一值
Get multiple arrays of mongodb documents and merge them for unique values
我需要获取所有标签,这些标签存储在一个数组中用于多个文档。我可以通过以下方式 select 所有需要的文件:
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')
以上命令将为您提供数组中不同的值。不会有任何重复的元素。这样你的第二个问题也就解决了
我需要获取所有标签,这些标签存储在一个数组中用于多个文档。我可以通过以下方式 select 所有需要的文件:
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')
以上命令将为您提供数组中不同的值。不会有任何重复的元素。这样你的第二个问题也就解决了