Javascript 在集合的键中查找数据的最大长度
我的收藏中有数千件。我需要查看所有SomeOther数据并执行以下操作Javascript 在集合的键中查找数据的最大长度,javascript,mongodb,mapreduce,Javascript,Mongodb,Mapreduce,我的收藏中有数千件。我需要查看所有SomeOther数据并执行以下操作 检查它是否存在(在一些记录中,我有位置1,没有位置4) 查找最长的记录(以字符串长度为单位) 输出必须如下所示(显示最长字符数) 我正在使用Mongodb 3.2.9,因此无法访问新的聚合函数。但我有Mongodb的外壳 编辑:为了清楚起见,我想要整个系列中最长的。因此,可能有1000个文档,但在整个集合中,每个字段只有一个最长的结果 为此,请使用.mapReduce()将每个键的值减小到最大值: { place1
.mapReduce()
将每个键的值减小到最大值:
{
place1: 123,
place2: 12,
place3: 17
place4: 445
}
它基本上发出每个文档的子文档路径中存在的每个键的“长度”
,然后在“缩减”中,实际上只返回每个键的最大“长度”
请注意,在mapReduce
中,您需要输出与您输入的相同的结构,因为它处理大量文档的方式是逐步批量“减少”。这就是为什么我们以数字形式发出,就像“reduce”
函数一样
在问题中显示的文档上提供此输出。当然,当您有更多文档时,它是集合中所有文档的“最大值”
db.collection.mapReduce(
function() {
emit(null,
Object.keys(this.someotherdata).map(k => ({ [k]: this.someotherdata[k].length }))
.reduce((acc,curr) => Object.assign(acc,curr),{})
);
},
function(key,values) {
var result = {};
values.forEach(value => {
Object.keys(value).forEach(k => {
if (!result.hasOwnProperty(k))
result[k] = 0;
if ( value[k] > result[k] )
result[k] = value[k];
});
});
return result;
},
{
"out": { "inline": 1 },
"query": { "someotherdata": { "$exists": true } }
}
)
对于感兴趣的人来说,问题的背景实际上是MongoDB 3.4的功能对他们来说是不可用的。但要在功能可用的情况下使用.aggregate()
执行相同的操作:
{
"_id" : null,
"value" : {
"place1" : 25.0,
"place2" : 26.0,
"place3" : 13.0,
"place4" : 38.0
}
}
具有相同的输出:
db.collection.aggregate([
{ "$match": { "someotherdata": { "$exists": true } } },
{ "$project": {
"_id": 0,
"someotherdata": {
"$map": {
"input": { "$objectToArray": "$someotherdata" },
"as": "s",
"in": { "k": "$$s.k", "v": { "$strLenCP": "$$s.v" } }
}
}
}},
{ "$unwind": "$someotherdata" },
{ "$group": {
"_id": "$someotherdata.k",
"v": { "$max": "$someotherdata.v" }
}},
{ "$sort": { "_id": 1 } },
{ "$group": {
"_id": null,
"data": {
"$push": { "k": "$_id", "v": "$v" }
}
}},
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": "$data"
}
}}
])
用于遍历集合。
跟踪最长的placen值(从-1开始,找到较大值时更新)。使用Print()
或printjson()
打印值,而无需访问$strLenBytes
或$strLenCP
您需要使用mapReduce
并使用JavaScript函数返回每个属性的长度。现在还不清楚您是在要求整个集合中的“每个键的最长长度”,还是“每个文档中每个键的长度”,甚至还不清楚输出应该是什么。例如,您显示的文档有4个可能的键,仅输出3个。@NeilLunn我已经编辑了我的答案当我在ROBO 3T mongo shell中运行时,它显示“错误:第6行:意外标记;@32423hjh32423我的错误”。缺少括号。表示无法执行脚本。错误:映射减少失败:{“确定”:0,“errmsg”:“类型错误:this.someotherdata[k]为空:\n_funcs1/@32423hjh32423 Well是实际调用的”someotherdata的字段"
?因为这是在你的问题中。如果你的数据与你在问题中的数据不同,那么这些更改取决于你,而不是回答问题的人。我可以添加一个$exists
,以丢弃没有字段的文档,但这取决于你是否使用正确的命名。我理解你提到的命名问题,我有一个问题ged的名字,但我已经补偿了。这只是一个直接交换的东西。我认为$exists将是有用的,因为我认为这就是为什么它是失败的,因为在集合中的项目之间的差异。谢谢
db.collection.aggregate([
{ "$match": { "someotherdata": { "$exists": true } } },
{ "$project": {
"_id": 0,
"someotherdata": {
"$map": {
"input": { "$objectToArray": "$someotherdata" },
"as": "s",
"in": { "k": "$$s.k", "v": { "$strLenCP": "$$s.v" } }
}
}
}},
{ "$unwind": "$someotherdata" },
{ "$group": {
"_id": "$someotherdata.k",
"v": { "$max": "$someotherdata.v" }
}},
{ "$sort": { "_id": 1 } },
{ "$group": {
"_id": null,
"data": {
"$push": { "k": "$_id", "v": "$v" }
}
}},
{ "$replaceRoot": {
"newRoot": {
"$arrayToObject": "$data"
}
}}
])
{
"place1" : 25,
"place2" : 26,
"place3" : 13,
"place4" : 38
}