Вы в основном нужно учитывать _id
для группировки, как "массив" возможного "до" и "от" значений, а затем конечно, «сортировать» их, так что в каждом документе комбинация всегда находится в одном порядке.
Как примечание, я хочу добавить, что «обычно», когда я имею дело с системами обмена сообщениями, как это, отправители/получатели «от» и «от» обычно являются как массивами для начала, так и обычно образует основу, из которой исходят разные вариации этого утверждения.
Во-первых, наиболее оптимальным MongoDB 3.2 утверждение, для отдельных адресов
db.collection.aggregate([
// Join in array
{ "$project": {
"people": [ "$to", "$from" ],
}},
// Unwind array
{ "$unwind": "$people" },
// Sort array
{ "$sort": { "_id": 1, "people": 1 } },
// Group document
{ "$group": {
"_id": "$_id",
"people": { "$push": "$people" }
}},
// Group people and count
{ "$group": {
"_id": "$people",
"count": { "$sum": 1 }
}}
]);
Вот основы, а теперь только вариации в строительстве «люди» массива (стадия 1 только выше).
MongoDB 3.x и 2.6.x - Массивы
{ "$project": {
"people": { "$setUnion": [ "$to", "$from" ] }
}}
MongoDB 3.x и 2.6.x - Поля для массива
{ "$project": {
"people": {
"$map": {
"input": ["A","B"],
"as": "el",
"in": {
"$cond": [
{ "$eq": [ "A", "$$el" ] },
"$to",
"$from"
]
}
}
}
}}
MongoDB 2.4.x и 2.2.х - от полея
{ "$project": {
"to": 1,
"from": 1,
"type": { "$const": [ "A", "B" ] }
}},
{ "$unwind": "$type" },
{ "$group": {
"_id": "$_id",
"people": {
"$addToSet": {
"$cond": [
{ "$eq": [ "$type", "A" ] },
"$to",
"$from"
]
}
}
}}
Но во всех случаях:
Получить все получатель в отдельный массив.
Заказывайте массив последовательного порядка
группы по «всегда в том же порядке» список получателей.
Следуйте за этим, и вы не ошибетесь.
Я думаю, что вы уже учли сумму в оба конца. результат может понравиться belows: {_id: {from: "a", to: "b"}, count 100} {_id: {from: "b", to: "a"}, count: 1000}, в обоих направлениях результаты выводятся. – zydcom
@zydcom: Нет, нет. –