与MongoDB就一组答案/问题进行高级匹配/评分
我的用户数据如下所示:与MongoDB就一组答案/问题进行高级匹配/评分,mongodb,mongodb-query,Mongodb,Mongodb Query,我的用户数据如下所示: { name: 'Some Name', uid: 'rew54bth324' // Can be 1000s answers: { do_you_like_cars: 'Prefer bikes', hotels_or_hostels: 'Tents!', vegan: 'Pesca', }, // Can be 100,000s. usersSeenThisUser: [
{
name: 'Some Name',
uid: 'rew54bth324'
// Can be 1000s
answers: {
do_you_like_cars: 'Prefer bikes',
hotels_or_hostels: 'Tents!',
vegan: 'Pesca',
},
// Can be 100,000s.
usersSeenThisUser: [
'wgwewg343',
'vyuzx3tg'
],
lat: 32.0,
lng: 43.5
}
另一个用户也回答了一组问题,其中一些问题可能是相同的。
我的问题是:在忽略用户看到该用户时,如何根据有多少答案相同/相似(至少1个)得到结果列表
在ElasticSearch中,使用“应该”查询非常简单,并且它还为每个结果提供了最大分数+分数
Mongo中的查询是什么?您可以尝试以下查询:
db.collection.aggregate([
/** Optional - Remove unnecessary fields to reduce document size */
{ $project: { usersSeenThisUser: 0 } },
/** Convert 'answers' object to array [{k:...,v:...},{k:...,v:...}] */
{ $addFields: { answers: { $objectToArray: "$answers" } } },
/** Unwind 'answers' array inorder to group similar answered question & it's value */
{ $unwind: "$answers" },
/** Group on k & v & push user who has similar answers */
{
$group: {
_id: { k: "$answers.k", v: "$answers.v" },
users: { $push: "$name" }
}
},
/** match docs(answers) which has two or more users */
{ $match: { $expr: { $gte: [{ $size: "$users" }, 2] } } },
/** Group on 'users' array where two user's array is same & push all answers to 'answers' array */
{
$group: {
_id: "$users",
answers: {
$push: "$_id"
}
}
},
/** Transform fields to the way required, answers array of objects to a single object {k:v,k:v} */
{
$project: { _id: 0, users: "$_id", answers: { $arrayToObject: "$answers" } }
}
]);
测试:您需要哪些字段作为响应&您的收藏中可能有多少用户文档,加上分数的确切含义?@whoami抱歉睡着了,数百万。了不起的人谢谢,我要做一个一百万用户的测试,对正确的索引有什么建议吗?此外,我们的想法是让一组用户“匹配”到这个用户,并避免他们已经“刷”过去的,想想Tinder约会(不是应用程序是什么)@Oliver Dixon:这会避免他们已经“刷”过去的吗?在
userssenthisuser
中,即使用户的答案与给定用户匹配,也要避免用户?所以你在寻找一个用户&他的相关用户,他们的答案是匹配的。这是两件事,可能有相关答案的用户,按分数排序(即匹配度最高的用户)和未见面的用户。@OliverDixon:现在在提供的测试中,查询正在对所有用户执行操作,对吗?或者,您是否传入用户名(某个名称)&获取所有给出与(某个名称)相同答案的用户?因为这两个要求的复杂性有很大不同,所以我们可能会继续使用ElasticSearch和Firestore,是的,目前我有36个活动客户端,拥有数百万用户:-)