2012-06-05 4 views
0

У меня есть база данных MongoDB с документами, которые выглядят так:Construct Количество запросов в MongoDB

{"users" : ["u1", "u2", "u3"]} 
{"users" : ["u1", "u4"]} 
{"users" : ["u1", "u3", "u5", "u6", "u7"]} 

Я хотел бы, чтобы получить кол-документа с большим количеством пользователей. Используя вышеизложенное, запрос вернет 5 как самый высокий счет пользователя в базе данных. Как я могу это сделать в MongoDB?

я могу получить ряд документов с определенным размером с:

db.mydb.find({users: {$size: 5}}).count() 

Однако, я не могу понять, как найти наибольшее количество среди всех документов в массиве пользователя.

Спасибо.

ответ

2

Вы не можете сделать это непосредственно в MongoDB. Однако вы можете сделать дополнительное поле в том же документе, что и «user_count», и use the $inc operator, чтобы увеличить его каждый раз при добавлении нового пользователя в массив «users».

Ваше обновление будет выглядеть примерно так:

db.mydb.update({<update_condition>}, {$push :{"users":"u8"}, $inc : {"user_count":1}}) 
0

Ниже приведены три рабочие решения в MongoDB, однако ответ Аси может быть более подходящим, в зависимости от ваших инженерных потребностей. Вы должны отвечать на такие вопросы, как: насколько велика моя коллекция, и какова стоимость/эффективность для каждого потенциального решения? Есть ли другие проблемы с производительностью? Могу ли я решить эту проблему более эффективно путем хранения книг в проблемной области?

Вы должны рассмотреть возможность отслеживания максимального количества в явном виде через приложение, если это общий вопрос. Для увеличения количества пользователей вы просто отслеживаете макс. Но (только), если есть уменьшение в документе от текущего максимума, вы должны оплатить стоимость полного запроса. Решение Asya может по-прежнему помогать в этом полном запросе.

Здесь представлены возможности MongoDB. Пожалуйста, внимательно изучите документацию в отношении вашей проблемы и производительности или технических характеристик.

  1. db.eval выполнение кода сервера размер - http://www.mongodb.org/display/DOCS/Server-side+Code+Execution

    ВНИМАНИЕ: Используйте карту/уменьшить вместо db.eval() для длительных работ. db.eval блокирует другие операции!

  2. Aggregation "группа" - http://www.mongodb.org/display/DOCS/Aggregation

  3. MapReduce - http://www.mongodb.org/display/DOCS/MapReduce

count_query.js

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