【问题标题】:How to get unique list from multiple arrays in MongoDB如何从MongoDB中的多个数组中获取唯一列表
【发布时间】:2012-03-23 23:37:07
【问题描述】:

假设我的 MongoDB 中有数千个类似的条目

{
    "_id": "1",
    "data": {
        "people": [
            {
                "id": "234323432"
            },
            {
                "id": "44213126"
            },
            {
                "id": "1321452"
            }
        ],
        "guys": [
            {
                "id": "521452"
            },
            {
                "id": "92321452"
            }
        ]
    }
}

我想(从数组中)获取所有人和人的 ID,并将它们分组以仅获取它们的唯一列表。是否只能在 MongoDB 中执行此操作?

【问题讨论】:

    标签: arrays mongodb unique pymongo


    【解决方案1】:

    根据您希望输出的内容,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 } }
    

    您可以根据您希望如何表示您的数据或您想用它做什么来塑造上述内容,但希望这对您有所帮助。

    【讨论】:

      【解决方案2】:

      您可以在客户端合并它们。根据您使用的语言,它可以从非常简单到简单。

      【讨论】:

      • 我当然可以这样做,但这会绕过在 MongoDB 中这样做的美妙之处
      • 嗯,这取决于你对美的定义。如果你让 Mongo 去做:它是由服务器完成的更多工作。由于无论如何您都将下载所有数据,因此将处理负担转嫁给客户端可能是值得的。这真的取决于你的架构。
      【解决方案3】:

      我建议你深入研究 mongo 的 MapReduce:

      http://www.mongodb.org/display/DOCS/MapReduce

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-22
        • 1970-01-01
        相关资源
        最近更新 更多