Я создаю приложение, которое можно сравнить с приложением для знакомств.
У меня есть несколько документов с такой структурой:
$ db.profiles.find().pretty()
[
{
"_id": 1,
"firstName": "John",
"lastName": "Smith",
"fieldValues": [
"favouriteColour|red",
"food|pizza",
"food|chinese"
]
},
{
"_id": 2,
"firstName": "Sarah",
"lastName": "Jane",
"fieldValues": [
"favouriteColour|blue",
"food|pizza",
"food|mexican",
"pets|yes"
]
},
{
"_id": 3,
"firstName": "Rachel",
"lastName": "Jones",
"fieldValues": [
"food|pizza"
]
}
]
Я пытаюсь определить профили, которые соответствуют друг другу на одном или нескольких fieldValues
.
Итак, в приведенном выше примере мой идеальный результат будет выглядеть примерно так:
<some query>
result:
[
{
"_id": "507f1f77bcf86cd799439011",
"dateCreated": "2013-12-01",
"profiles": [
{
"_id": 1,
"firstName": "John",
"lastName": "Smith",
"fieldValues": [
"favouriteColour|red",
"food|pizza",
"food|chinese"
]
},
{
"_id": 2,
"firstName": "Sarah",
"lastName": "Jane",
"fieldValues": [
"favouriteColour|blue",
"food|pizza",
"food|mexican",
"pets|yes"
]
},
]
},
{
"_id": "356g1dgk5cf86cd737858595",
"dateCreated": "2013-12-02",
"profiles": [
{
"_id": 1,
"firstName": "John",
"lastName": "Smith",
"fieldValues": [
"favouriteColour|red",
"food|pizza",
"food|chinese"
]
},
{
"_id": 3,
"firstName": "Rachel",
"lastName": "Jones",
"fieldValues": [
"food|pizza"
]
}
]
}
]
Я думал о том, чтобы сделать это либо как уменьшение карты, либо с помощью структуры агрегации.
В любом случае «результат» будет сохранен в коллекции (согласно «результатам» выше)
У меня вопрос, какой из двух больше подходит? И с чего мне начать это реализовывать?
Изменить
Короче говоря, модель нельзя легко изменить.
Это не похоже на «профиль» в традиционном смысле.
То, что я в основном хочу сделать (в псевдокоде), похоже на:
foreach profile in db.profiles.find()
foreach otherProfile in db.profiles.find("_id": {$ne: profile._id})
if profile.fieldValues matches any otherProfie.fieldValues
//it's a match!
Очевидно, что такая операция очень и очень медленная!
Также стоит упомянуть, что эти данные никогда не отображаются, это буквально просто строковое значение, которое используется для «сопоставления»