Arrays 如何在MongoDB中从多个数组中获取唯一列表
假设我的MongoDB中有数千个类似的条目Arrays 如何在MongoDB中从多个数组中获取唯一列表,arrays,mongodb,unique,pymongo,Arrays,Mongodb,Unique,Pymongo,假设我的MongoDB中有数千个类似的条目 { "_id": "1", "data": { "people": [ { "id": "234323432" }, { "id": "44213126" }, { "id": "1321452"
{
"_id": "1",
"data": {
"people": [
{
"id": "234323432"
},
{
"id": "44213126"
},
{
"id": "1321452"
}
],
"guys": [
{
"id": "521452"
},
{
"id": "92321452"
}
]
}
}
我想得到所有的人和家伙ID(从数组中),并将他们分组,以获得唯一的列表。只有在MongoDB中才能做到这一点吗?我建议您深入研究mongo的MapReduce:
我建议您深入研究mongo的MapReduce:
您可以在客户端合并它们。根据您所使用的语言,它可以是非常简单的,也可以是简单的。您可以在客户端将它们合并。取决于您使用的语言,它可以是非常简单的,也可以是容易的。取决于您希望输出的内容,map reduce无疑是一种方法。下面是一个简单的示例,它将获取上面的文档,隔离唯一ID,并统计每个ID的出现次数:
map = function() {
this.data.people.forEach(function(id){
emit(id, {count:1});
});
this.data.guys.forEach(function(id){
emit(id, {count:1});
});
};
reduce = function(key, values) {
var total = 0;
values.forEach(function(value) {
total += value.count;
});
return {count: total};
};
db.test.mapReduce(map, reduce, {out: 'result'});
如果您的数据集是:
{ "_id" : 1, "data" : { "people" : [ { "id" : "234323432" }, { "id" : "44213126" }, { "id" : "1321452" } ], "guys" : [ { "id" : "521452" }, { "id" : "92321452" } ] } }
{ "_id" : 2, "data" : { "people" : [ { "id" : "234323432" }, { "id" : "44213126" }, { "id" : "1321452" } ], "guys" : [ { "id" : "521452" }, { "id" : "92321452" } ] } }
{ "_id" : 3, "data" : { "people" : [ { "id" : "234323432" }, { "id" : "44213126" }, { "id" : "1321452" } ], "guys" : [ { "id" : "521452" }, { "id" : "92321452" } ] } }
运行:
db.test.mapReduce(map, reduce, {out: 'result'});
将生成名为“result”的集合,其中包含以下内容:
{ "_id" : { "id" : "1321452" }, "value" : { "count" : 3 } }
{ "_id" : { "id" : "234323432" }, "value" : { "count" : 3 } }
{ "_id" : { "id" : "44213126" }, "value" : { "count" : 3 } }
{ "_id" : { "id" : "521452" }, "value" : { "count" : 3 } }
{ "_id" : { "id" : "92321452" }, "value" : { "count" : 3 } }
您可以根据您希望如何表示数据或如何处理数据来对上述内容进行建模,但希望这对您有所帮助。根据您希望输出的内容,map reduce无疑是一个不错的选择。下面是一个简单的示例,它将获取上面的文档,隔离唯一ID,并统计每个ID的出现次数:
map = function() {
this.data.people.forEach(function(id){
emit(id, {count:1});
});
this.data.guys.forEach(function(id){
emit(id, {count:1});
});
};
reduce = function(key, values) {
var total = 0;
values.forEach(function(value) {
total += value.count;
});
return {count: total};
};
db.test.mapReduce(map, reduce, {out: 'result'});
如果您的数据集是:
{ "_id" : 1, "data" : { "people" : [ { "id" : "234323432" }, { "id" : "44213126" }, { "id" : "1321452" } ], "guys" : [ { "id" : "521452" }, { "id" : "92321452" } ] } }
{ "_id" : 2, "data" : { "people" : [ { "id" : "234323432" }, { "id" : "44213126" }, { "id" : "1321452" } ], "guys" : [ { "id" : "521452" }, { "id" : "92321452" } ] } }
{ "_id" : 3, "data" : { "people" : [ { "id" : "234323432" }, { "id" : "44213126" }, { "id" : "1321452" } ], "guys" : [ { "id" : "521452" }, { "id" : "92321452" } ] } }
运行:
db.test.mapReduce(map, reduce, {out: 'result'});
将生成名为“result”的集合,其中包含以下内容:
{ "_id" : { "id" : "1321452" }, "value" : { "count" : 3 } }
{ "_id" : { "id" : "234323432" }, "value" : { "count" : 3 } }
{ "_id" : { "id" : "44213126" }, "value" : { "count" : 3 } }
{ "_id" : { "id" : "521452" }, "value" : { "count" : 3 } }
{ "_id" : { "id" : "92321452" }, "value" : { "count" : 3 } }
您可以将上述内容塑造为您希望如何表示数据或如何处理数据,但希望这对您有所帮助。当然,我可以这样做,但这将绕过在MongoDBWell中进行此操作的美妙之处,这取决于您对美的定义。如果您要求Mongo这样做:这是服务器所做的更多工作。由于您将以任何方式下载所有数据,因此将处理负担传递给客户端可能是值得的。这真的取决于你的架构。当然我可以做到,但这将绕过在MongoDBWell中实现的美,这取决于你对美的定义。如果您要求Mongo这样做:这是服务器所做的更多工作。由于您将以任何方式下载所有数据,因此将处理负担传递给客户端可能是值得的。这取决于你的架构。