Не могли бы вы уточнить, что именно вы хотели бы сделать? Вы хотите вернуть документы с уникальными значениями «текста» с наибольшим значением «количества»?
Например, учитывая коллекцию:
> db.text.find({}, {_id:0})
{ "text" : "here is text", "count" : 13, "somefield" : "value" }
{ "text" : "here is text", "count" : 12, "somefield" : "value" }
{ "text" : "here is text", "count" : 10, "somefield" : "value" }
{ "text" : "other text", "count" : 4, "somefield" : "value" }
{ "text" : "other text", "count" : 3, "somefield" : "value" }
{ "text" : "other text", "count" : 2, "somefield" : "value" }
>
(I have omitted _id values for brevity)
Вы хотите вернуть только те документы, которые содержат уникальный текст с наибольшим значением «количества»?
{ "text" : "here is text", "count" : 13, "somefield" : "value" }
а также
{ "text" : "other text", "count" : 4, "somefield" : "value" }
Один из способов сделать это — использовать функции $group и $max в новой структуре агрегации. Документацию по $group можно найти здесь: http://docs.mongodb.org/manual/aggregation/
> db.text.aggregate({$group : {_id:"$text", "maxCount":{$max:"$count"}}})
{
"result" : [
{
"_id" : "other text",
"maxCount" : 4
},
{
"_id" : "here is text",
"maxCount" : 13
}
],
"ok" : 1
}
Как видите, вышеуказанное не возвращает исходные документы. Если желательны исходные документы, затем может быть выполнен запрос, чтобы найти документы, соответствующие уникальному тексту и значениям счетчика.
В качестве альтернативы вы можете сначала запустить команду «различные», чтобы вернуть массив всех различных значений, а затем выполнить запрос для каждого значения с сортировкой и ограничением, чтобы вернуть документ с наибольшим значением «количество». Методы sort() и limit() объясняются в разделе «Методы курсора» документации «Расширенные запросы»: http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries.-CursorMethods
> var values = db.runCommand({distinct:"text", key:"text"}).values
> values
[ "here is text", "other text" ]
> for(v in values){var c = db.text.find({"text":values[v]}).sort({count:-1}).limit(1); c.forEach(printjson);}
{
"_id" : ObjectId("4f7b50b2df77a5e0fd4ccbf1"),
"text" : "here is text",
"count" : 13,
"somefield" : "value"
}
{
"_id" : ObjectId("4f7b50b2df77a5e0fd4ccbf4"),
"text" : "other text",
"count" : 4,
"somefield" : "value"
}
Неясно, именно это вы пытаетесь сделать, но я надеюсь, что это по крайней мере даст вам некоторые идеи для начала. Если я неправильно понял, объясните, пожалуйста, более подробно, какую именно операцию вы хотели бы выполнить, и, надеюсь, я или другой член Сообщества смогу вам помочь. Спасибо.
person
Marc
schedule
03.04.2012