JRazor
@JRazor
Senior StarkOverFlow Programmer

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"}
    }}}
])

Но это не работает. Почему?
  • Вопрос задан
  • 195 просмотров
Пригласить эксперта
Ответы на вопрос 1
@iShatokhin
JS developer
А не проще mapReduce использовать для этой задачи?

collection.mapReduce(
	"function () { emit('_id', this.sender === SENDER ? this.sender : this.recipient); }",
	/* топорное решение, для ускорения можно использовать объект как промежуточное хранилище */
	"function (key, value) { return value.filter((v, i, a) => a.indexOf(v) === i); }",  
	{
		query: {"$or": [{"recipient": sender}, {"sender": sender}] },
		out: { inline: 1 },
		scope: {
			SENDER: sender
		}
	}
);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы