Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与MongoDB就一组答案/问题进行高级匹配/评分_Mongodb_Mongodb Query - Fatal编程技术网

与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个活动客户端,拥有数百万用户:-)