Mongo: multiply distinct с условием. Как осуществить? Приветствую всех. Есть документ с записями вида:{ "recipient": "Josh", "sender": "Mike" } Каждая запись - это определенное сообщение от одного пользователя другому. Моя цель - получить уникальный список людей, с которыми общался пользователь (писал им или просто получал сообщения). Есть два запроса:contacts_recipient = db.test_collection.distinct( "recipient", {"$or": [{"recipient": sender}, {"sender": sender}] }) contacts_sender = db.test_collection.distinct( "sender", {"$or": [{"recipient": sender}, {"sender": sender}] }) Когда я попытался обьеденить их в один, то получилось следующее:result = db.test_collection.aggregate([ {"$match": {"$or": [{"recipient": sender}, {"sender": sender}]}}, {"$group": {"_id": { "$cond": { "if": { "sender": {"$eq": ["$sender", sender]} }, "then": "$recipient", "else": "$sender"} }}} ]) Но это не работает. Почему?
В вашем коде агрегации вы неправильно используете оператор $cond. Он принимает три аргумента: условие, значение при истине условия и значение при лжи условия. В вашем случае, вы пытаетесь использовать {"sender": {"$eq": ["$sender", sender]} как условие, но это неправильный синтаксис.
Вместо этого, вы можете использовать оператор $project для проецирования нового поля, которое будет содержать уникальные имена пользователей после этапа $match.
В вашем коде агрегации вы неправильно используете оператор $cond. Он принимает три аргумента: условие, значение при истине условия и значение при лжи условия. В вашем случае, вы пытаетесь использовать {"sender": {"$eq": ["$sender", sender]} как условие, но это неправильный синтаксис.
Вместо этого, вы можете использовать оператор $project для проецирования нового поля, которое будет содержать уникальные имена пользователей после этапа $match.
Пример кода может выглядеть следующим образом:
result = db.test_collection.aggregate([{"$match": {"$or": [{"recipient": sender}, {"sender": sender}]}},
{"$project": {
"conversation_partner": {
"$cond": {
"if": {"$eq": ["$sender", sender]},
"then": "$recipient",
"else": "$sender"
}
}
}},
{"$group": {"_id": "$conversation_partner"}}
])
Этот код должен вернуть уникальный список пользователей, с которыми пользователь общался (писал или получал сообщения).