我正在为我一直在使用的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个值)。
答案 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
}