{
"_id" : ObjectId("59786a62a96166007d7e364dsadasfafsdfsdgdfgfd"),
"someotherdata" : {
"place1" : "lwekjfrhweriufesdfwergfwr",
"place2" : "sgfertgryrctshyctrhysdthc ",
"place3" : "sdfsdgfrdgfvk",
"place4" : "asdfkjaseeeeeeeeeeeeeeeeefjnhwklegvds."
}
}
我的收藏中有数千个。我需要查看所有其他数据并执行以下操作
- 检查它是否存在(在某些记录中我有 place1 而不是 place4)
- 找到最长的记录(根据字符串长度)
输出必须看起来像这样(显示最长的字符数)
{
place1: 123,
place2: 12,
place3: 17
place4: 445
}
我正在使用 Mongodb 3.2.9,因此无法访问新的聚合函数。但我确实有 Mongodb shell
编辑:明确地说,我想要整个系列中最长的。因此,可能有 1000 个文档,但整个集合中每个字段只有一个长度最长的结果。
最佳答案
为此使用 .mapReduce()
减少每个键的最大值:
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 } }
}
)
它基本上发出每个文档的子文档路径中存在的每个键的“长度”
,然后在“减少”中,只有最大的“长度”
实际上返回了每个 key 。
请注意,在 mapReduce
中,您需要输出与输入的结构相同的结构,因为它处理大量文档的方式是逐步“减少”。这就是我们以数字形式发出
的原因,就像“reduce”
函数一样。
在问题中显示的文档中提供此输出。当然,当您有更多文档时,它是集合中所有文档的“最大值”。
{
"_id" : null,
"value" : {
"place1" : 25.0,
"place2" : 26.0,
"place3" : 13.0,
"place4" : 38.0
}
}
对于感兴趣的人,问题的背景实际上是他们无法使用 MongoDB 3.4 的功能。但是要在功能可用的地方使用 .aggregate()
做同样的事情:
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
}
关于javascript - 在集合的键中查找最大数据长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45441813/