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"}
}}}
])
Но это не работает. Почему?

21 Авг 2019 в 06:22
226 +1
1
Ответы
1

В вашем коде агрегации вы неправильно используете оператор $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"}}
])

Этот код должен вернуть уникальный список пользователей, с которыми пользователь общался (писал или получал сообщения).

20 Апр 2024 в 13:19
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир