2016-12-16 69 views
1

这是一个来自mongo文档的视图。我只想保留键值最长的文档中的条目。这里的关键值是一个字符串,因此,与最长的字符串长度的密钥应该只停留过滤器mongo文档 - python

{ 
    "_id" : ObjectId("585a431415c7a981b47ac4ee"), 
    "key" : "http://www.adnansami.com", 
    "value" : "A" 
} 
{ 
    "_id" : ObjectId("585a431415c7a981b47ac4ef"), 
    "key" : "http://www.leap-networks.com", 
    "value" : "BB" 
} 
{ 
    "_id" : ObjectId("585a431d15c7a981b47ac4f0"), 
    "key" : "http://www.leap-networks.com", 
    "value" : "B" 
} 
{ 
    "_id" : ObjectId("585a431d15c7a981b47ac4f1"), 
    "key" : "http://www.machinelearningmastery.com", 
    "value" : "C" 
} 
{ 
    "_id" : ObjectId("585a432515c7a981b47ac4f2"), 
    "key" : "http://www.leap-networks.com", 
    "value" : "BBB" 
} 
{ 
    "_id" : ObjectId("585a432815c7a981b47ac4f3"), 
    "key" : "http://www.machinelearningmastery.com", 
    "value" : "CC" 
} 
{ 
    "_id" : ObjectId("585a432d15c7a981b47ac4f4"), 
    "key" : "http://www.leap-networks.com", 
    "value" : "BBBB" 
} 
{ 
    "_id" : ObjectId("585a433115c7a981b47ac4f5"), 
    "key" : "http://www.machinelearningmastery.com", 
    "value" : "CCC" 
} 
{ 
    "_id" : ObjectId("585a433615c7a981b47ac4f6"), 
    "key" : "http://www.leap-networks.com", 
    "value" : "BBBBB" 
} 
{ 
    "_id" : ObjectId("585a433d15c7a981b47ac4f7"), 
    "key" : "http://www.machinelearningmastery.com", 
    "value" : "CCCC" 
} 
{ 
    "_id" : ObjectId("585a434915c7a981b47ac4f8"), 
    "key" : "http://www.machinelearningmastery.com", 
    "value" : "CCCCC" 
} 

所以输出应该是

{ 
    "_id" : ObjectId("58539dc715c7a964817686f9"), 
    "http://www.adnansami.com" : "A " 
    } 
    { 
    "_id" : ObjectId("585a433615c7a981b47ac4f6"), 
    "key" : "http://www.leap-networks.com", 
    "value" : "BBBBB" 
    } 
    { 
    "_id" : ObjectId("585a434915c7a981b47ac4f8"), 
    "key" : "http://www.machinelearningmastery.com", 
    "value" : "CCCCC" 
    } 

我怎样才能做到这一点?

回答

2

这将是非常复杂的查询在mongo中,而不诉诸于一些map-reduce操作,因为散列键。蒙戈工作得很好,你有一个像

{ 
    "_id" : ObjectId("58539dfa15c7a96481768700"),   
    "key": "http://www.leap-networks.com", 
    "value": "AAAAAAAA" 
} 

,而不是一个键/值文档中的嵌入式结构,所以你应该考虑重组你的文件,使之可转位和MongoDB中更容易地搜索。

对于上面提出的架构,您可以应用聚合框架,您可以使用$strLenCP运营商的MongoDB 3.4计算值字段的长度:

db.collection.aggregate([ 
    { 
     "$addFields": { 
      "strLength": { 
       "$strLenCP": "$value" 
      } 
     } 
    }, 
    { "$sort": { "strLength": -1 } }, 
    { 
     "$group": { 
      "_id": "$key", 
      "value": { "$first": "$value" }, 
      "doc_id": { "$first": "$_id" }   
     } 
    }  
]) 

样本输出

{ 
    "doc_id": ObjectId("58539dc715c7a964817686f9"), 
    "_id" : "http://www.adnansami.com", 
    "value": "A "  
}, 
{ 
    "doc_id": ObjectId("58539dd515c7a964817686fc"), 
    "_id" : "http://www.movies.yahoo.com", 
    "value": "AAAA"  
}, 
{ 
    "doc_id": ObjectId("58539dfa15c7a96481768700"), 
    "_id" : "http://www.leap-networks.com", 
    "value": "AAAAAAAA"  
} 
+0

我越来越错误'字符名称中的点符号需要在第3行col 1'引号,尝试编辑,但不工作 – Guru

+0

我已编辑th我在文件中提出了有关变更的问题。有了这个更改文档,我只是从查询中删除了“收视率”。对不起,延迟回应 – Guru

+0

我对查询做了同样的改变,即:“去除评分”仍然无效? – Guru