Как использовать Distinct, Sort, limit с mongodb - PullRequest
2 голосов
/ 03 апреля 2012

У меня есть структура документа {'text': 'here is text', 'count' : 13, 'somefield': value}

Коллекция содержит несколько тысяч записей, и значение ключа text может повторяться много раз, я хочу найти отличный текст с наибольшим значением числа, наряду с этимвесь документ должен быть возвращен, я могу отсортировать их в порядке убывания.

distinct возвращает уникальное значение в списке.

Я хочу использовать все три функции, и документ должен бытьвернулся, я все еще учусь и не покрыл mapreduce.

1 Ответ

4 голосов
/ 04 апреля 2012

Не могли бы вы уточнить, что именно вы хотели бы сделать? Вы хотите вернуть документы с уникальными «текстовыми» значениями с наибольшим «счетным» значением?

Например, с учетом коллекции:

> 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)

Хотите ли вы вернуть только те документы, которые содержат уникальный текст с наибольшим значением 'count'?

{ "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"
}

Неясно, если это именно то, что вы пытаетесь сделать, но я надеюсь, что это, по крайней мере, даст вам некоторые идеи для начала. Если я неправильно понял, пожалуйста, объясните более подробно точную операцию, которую вы хотели бы выполнить, и, надеюсь, я или другой член Сообщества сможем вам помочь. Благодарю.

...