2013-06-19 3 views
0

У меня есть несколько документов из нижеуказанной формы в моей коллекции conversations, в которых есть чат между несколькими людьми. ThreadId имеет идентификатор одного из пользователей в разговоре между 2.Mongoose/Mongodb mapReduce или aggregate to group by single field

Диалог между 51c0c35b7daabc3410000001 и 51c0c35b7daabc3410000002

{ 
    "from" : ObjectId("51c0c35b7daabc3410000001"), 
    "to" : ObjectId("51c0c35b7daabc3410000002"), 
    "threadId" : ObjectId("51c0c35b7daabc3410000002"), 
    "message" : "Hi there!" 
} 

{ 
    "from" : ObjectId("51c0c35b7daabc3410000002"), 
    "to" : ObjectId("51c0c35b7daabc3410000001"), 
    "threadId" : ObjectId("51c0c35b7daabc3410000002"), 
    "message" : "How are you?" 
} 

{ 
    "from" : ObjectId("51c0c35b7daabc3410000001"), 
    "to" : ObjectId("51c0c35b7daabc3410000002"), 
    "threadId" : ObjectId("51c0c35b7daabc3410000002"), 
    "message" : "I am good. How are you?" 
} 

Диалог между 51c0c35b7daabc3410000001 и 51c0c69989a44a6812000003

{ 
    "from" : ObjectId("51c0c35b7daabc3410000001"), 
    "to" : ObjectId("51c0c69989a44a6812000003"), 
    "threadId" : ObjectId("51c0c69989a44a6812000003"), 
    "message" : "Hello!" 
} 

{ 
    "from" : ObjectId("51c0c69989a44a6812000003"), 
    "to" : ObjectId("51c0c35b7daabc3410000001"), 
    "threadId" : ObjectId("51c0c69989a44a6812000003"), 
    "message" : "Hey.." 
} 

Я хочу группы на основе ThreadId а выход должен иметь вид

{ 
    "from" : ObjectId("51c0c35b7daabc3410000001"), 
    "to" : ObjectId("51c0c35b7daabc3410000002"), 
    "threadId" : ObjectId("51c0c35b7daabc3410000002"), 
    "message" : "I am good. How are you?" 
} 

{ 
    "from" : ObjectId("51c0c69989a44a6812000003"), 
    "to" : ObjectId("51c0c35b7daabc3410000001"), 
    "threadId" : ObjectId("51c0c69989a44a6812000003"), 
    "message" : "Hey.." 
} 

Итак, я хочу найти все документы с отдельным threadId (или группой, основанной только на threadId). Результат также должен включать все остальные поля в документе.

mapReduce, совокупность/группа, отличная или их комбинация? Как мне это сделать?

EDIT

Чтобы поместить его в SQL заявление, я хочу что-то же просто, как

SELECT * FROM GROUP BY разговоров ThreadId;

ответ

0

я в конечном итоге делает это

// Aggregate pipeline 
Conversation.aggregate(
    { $match: { 
     listing: new ObjectId(listingId) 
     } 
    }, 
    { $group: { 
     _id: '$threadId', 
     message: { $last: "$message" }, 
     to: { $last: "$to" }, 
     from: { $last: "$from" } 
     } 
    }, 
    { $project : { 
     _id : 0, 
     threadId : "$_id", 
     message: "$message", 
     to: "$to", 
     from: "$from" 
     } 
    }, 
    function(err, threads) { 
     console.log(err); 
     console.log(threads); 
    } 
); 

Это, кажется, работает хорошо. Сообщите мне, есть ли более простой способ или можно оптимизировать этот фрагмент. Надеюсь, это поможет кому-то.

+0

Вам не нужен $ project на этом – advncd

+0

Как вы создали threadId? – Sekai