列出,计算所有键上唯一Mongo DB值的因子

时间:2013-03-06 22:36:43

标签: mongodb aggregation-framework pymongo

我正在为我一直在使用的MongoDB准备一个描述性的“架构”(quelle horreur)。

我使用优秀的variety.js创建了所有键的列表,并显示了每个键的覆盖范围。但是,如果与键对应的值具有一小组值,我希望能够将整个列表列为“可用值”。在R中,我会将这些视为分类变量的“因子”,即性别:[“M”,“F”]。

我知道我可以使用R + RMongo,查询每个变量,基本上我会创建一个直方图,但我想知道正确的Mongo.query()/ javascript / Map,Reduce接近这个的方法。我理解db.collection.aggregate()函数就是为此而设计的。

在提出这个问题之前,我引用了:

但是不能完全正确地获得管道订单。所以,例如,如果我有这样的文件:

{_id : 1, "key1" : "value1", "key2": "value3"}
{_id : 2, "key1" : "value2", "key2": "value3"}

我想返回类似的内容:

{"key1" : ["value1", "value2"]}
{"key2" : ["value3"]}

或者更好,有计数:

{"key1" : ["value1" : 1, "value2" : 1]}
{"key2" : ["value3" : 2]}

我认识到这样做的一个问题是任何具有各种不同值的值 - 因此,文本字段或连续变量。理想情况下,如果存在多于x个不同的可能值,则截断,例如不超过20个唯一值将是很好的。如果我发现它实际上更多,我会直接查询该变量。

是这样的:

db.collection.aggregate(
   {$limit: 20,
    $group: {
        _id: "$??varname",
        count: {$sum: 1}
   }})

首先,我如何引用?? varname?每个键的名称?

我看到这个链接占95%: Binning and tabulate (unique/count) in Mongo

...与

input data:

{ "_id" : 1, "age" : 22.34, "gender" : "f" }
{ "_id" : 2, "age" : 23.9, "gender" : "f" }
{ "_id" : 3, "age" : 27.4, "gender" : "f" }
{ "_id" : 4, "age" : 26.9, "gender" : "m" }
{ "_id" : 5, "age" : 26, "gender" : "m" }

这个脚本:

db.collection.aggregate(
   {$project: {gender:1}},
   {$group: {
        _id: "$gender",
        count: {$sum: 1}
   }})

产地:

{"result" : 
   [
     {"_id" : "m", "count" : 2},
     {"_id" : "f", "count" : 3}
   ],
   "ok" : 1
}

但是我不明白的是,我如何能够为具有潜在大量返回值的未知数量/名称的密钥执行此操作?此示例知道密钥名称是性别,并且响应集将很小(2个值)。

1 个答案:

答案 0 :(得分:1)

如果您已经运行了一个输出集合中所有键名称的脚本,则可以动态生成聚合框架管道。这意味着要么扩展variety.js类型脚本,要么只编写自己的脚本。

如果传递了一个名为“keys”的数组,它可能在JS中看起来像是有几个非“_ id”命名字段(我假设顶级字段,你不关心数组,嵌入式文档)等等。)

keys = ["key1", "key2"];
group = { "$group" : { "_id" : null } } ;
keys.forEach( function(f) {
     group["$group"][f+"List"] = { "$addToSet" : "$" + f };  } );
db.collection.aggregate(group);
{
    "result" : [
        {
            "_id" : null,
            "key1List" : [
                "value2",
                "value1"
            ],
            "key2List" : [
                "value3"
            ]
        }
    ],
    "ok" : 1
}