在MongoDB中构造计数查询
我有一个MongoDB数据库,其中的文档如下所示:在MongoDB中构造计数查询,mongodb,nosql,Mongodb,Nosql,我有一个MongoDB数据库,其中的文档如下所示: {"users" : ["u1", "u2", "u3"]} {"users" : ["u1", "u4"]} {"users" : ["u1", "u3", "u5", "u6", "u7"]} 我想获得用户数量较多的文档的计数。使用上述方法,查询将返回5作为数据库中的最高用户计数。我如何在MongoDB中做到这一点 我可以通过以下方式获得特定大小的文档数: db.mydb.find({users: {$size: 5}}).count()
{"users" : ["u1", "u2", "u3"]}
{"users" : ["u1", "u4"]}
{"users" : ["u1", "u3", "u5", "u6", "u7"]}
我想获得用户数量较多的文档的计数。使用上述方法,查询将返回5作为数据库中的最高用户计数。我如何在MongoDB中做到这一点
我可以通过以下方式获得特定大小的文档数:
db.mydb.find({users: {$size: 5}}).count()
但是,我不知道如何在用户数组中的所有文档中找到最大计数
谢谢。您不能直接在MongoDB中执行此操作。但是,您可以在同一文档中添加一个名为“user_count”的额外字段,并在每次向“users”数组添加新用户时将其递增1 您的更新看起来像:
db.mydb.update({<update_condition>}, {$push :{"users":"u8"}, $inc : {"user_count":1}})
db.mydb.update({},{$push:{“用户”:“u8”},$inc:{“用户计数”:1})
以下是MongoDB中的三种可行解决方案,但ASIA的答案可能更合适,具体取决于您的工程需求。您应该回答以下问题:我的收藏量有多大,每个潜在解决方案的成本/效率是多少?是否存在其他性能问题?我可以通过在问题域中记账来更有效地解决这个问题吗
<>你应该考虑通过应用程序显式地跟踪最大计数,如果这是一个常见的问题。对于用户的增加,您只需跟踪最大值。但是(仅)如果某个文档比当前最大值减少,您必须为完整查询支付成本。ASIA的解决方案可能仍然有助于完成这一完整查询
以下是MongoDB的可能性。请仔细检查有关您的问题、性能或工程影响的文档
db.mydb.drop();
db.mydb.save({"users" : ["u1", "u2", "u3"]});
db.mydb.save({"users" : ["u1", "u4"]});
db.mydb.save({"users" : ["u1", "u3", "u5", "u6", "u7"]});
//printjson(db.mydb.find().toArray());
printjson(db.eval(function() {
var count = 0;
db.mydb.find().forEach( function(doc) {
if (doc.users.length > count)
count = doc.users.length;
});
return count;
}));
printjson(db.mydb.group({
reduce: function(doc, prev) {
if (doc.users.length > prev.count)
prev.count = doc.users.length;
},
initial: {count: 0}
})[0].count);
printjson(db.mydb.mapReduce(
function() { emit(0, {count: this.users.length}); },
function(key, values) {
var result = {count: 0};
values.forEach(function(value) {
if (value.count > result.count)
result.count = value.count;
});
return result;
},
{out: {inline: 1}}
).results[0].value.count);
执行和输出
$ mongo count_query.js
MongoDB shell version: 2.0.4
connecting to: test
5
5
5