Mongodb Aggregate: объедините пользователей с похожими тегами - PullRequest
0 голосов
/ 11 июня 2019

У меня есть коллекция пользователей, пример документа таков:

{
"tags" : [ 
    {
        "title" : "Music Lover",
        "createdAt" : 1551260246829.0,
        "updatedAt" : 1551260246829.0,
        "id" : "5c765a56b84f7a23b86c01b9"
    }, 
    {
        "title" : "Coffee",
        "createdAt" : 1550577843788.0,
        "updatedAt" : 1550577843788.0,
        "id" : "5c6bf0b361a5f3278d802868"
    }, 
    {
        "title" : "Football",
        "createdAt" : 1550577855649.0,
        "updatedAt" : 1550577855649.0,
        "id" : "5c6bf0bf61a5f3278d802869"
    }, 
    {
        "title" : "Arts",
        "createdAt" : 1550577863515.0,
        "updatedAt" : 1550577863515.0,
        "id" : "5c6bf0c761a5f3278d80286b"
    }, 
    {
        "title" : "Technology",
        "createdAt" : 1550577869811.0,
        "updatedAt" : 1550577869811.0,
        "id" : "5c6bf0cd61a5f3278d80286c"
    }
],
"first_name" : "Asad",
"last_name" : "Khan",
"location" : {
    "type" : "Point",
    "coordinates" : [ 
        67.0431335, 
        24.8249635
    ]
},
"location_update_time" : "2019-05-31 11:28:00",
 }

ключ местоположения - 2dsphere.

Мне нужно сгруппировать нескольких пользователей, которые находятся рядом с каждымдругие, скажем, 100 м и имеют общие теги.

До сих пор я был в состоянии достичь

db.getCollection('user').aggregate([
  {
    "$geoNear": {
    near: { type: "Point", coordinates: [ 67.044535 , 24.825852 ] },
    distanceField: "dist.calculated",
    maxDistance: 2000,
    spherical: true
 }
  },
  { "$unwind": "$tags" },  
  { "$group": { "_id": "$tags.title", "count": { "$sum": 1 }, users: { $push : "$$ROOT" } }},
  {
    "$match": {
        "count": { "$gte": 2 }
     }
  }
 ])

Это дает мне теги, количество и пользователей, у которых они есть.Проблема в том, что он дает все теги отдельно, а пользователи дублируют их под каждым тегом.Кроме того, до сих пор нет способа добавить что-либо в запрос для групп пользователей, которые находятся на расстоянии менее 100 м друг от друга.

...