Выделите более чем одно поле, используя уменьшенную карту MongoDB - PullRequest
5 голосов
/ 18 сентября 2011

Я хочу выполнить этот оператор SQL на MongoDB:

SELECT DISTINCT book,author from library

Пока DISTINCT от MongoDB поддерживает только одно поле за раз. Для более чем одного поля мы должны использовать команду GROUP или map-Reduce.

Я нашел способ использования команды GROUP:

db.library.group({ 
    key: {book:1, author:1}, 
    reduce: function(obj, prev) { if (!obj.hasOwnProperty("key")) { 
        prev.book = obj.book; 
        prev.author = obj.author; 
    }}, 
    initial: { } 
});  

Однако этот подход поддерживает только до 10 000 ключей. Кто-нибудь знает, как использовать карту Reduce для решения этой проблемы?

Ответы [ 2 ]

4 голосов
/ 19 сентября 2011

Взгляните на эту статью , в которой объясняется, как найти уникальные статьи, используя map-redund в MongoDB.

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

emit({book: this.book, author: this.author}, {exists: 1});

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

return {exists: 1};
3 голосов
/ 19 сентября 2011

В случае, если кто-то сталкивается с подобной проблемой.Это полное решение:

Шаг карты

map= "function(){ 
    emit(
            {book: this.book, author:this.author}, {exists: 1}
        ); 
    }"

Шаг уменьшения

reduce= "function(key, value){
            return {exists: 1};
    }"  

Выполнитькоманда

result= db.runCommand({
        "mapreduce": "library",
        "map": map,
        "reduce": reduce,
        "out: "result"
    })  

Получить результат

db.result.find()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...