MongoDB: Получить все рядом с фильтром - PullRequest
0 голосов
/ 11 сентября 2018

В MongoDB у меня есть модели User, Token и Boost.

Пользователь может иметь один или несколько токенов и одно или несколько усилений.

Token имеет поле 2dsphere.

И Boost имеет startTime и stopTime поля даты.

Пользователь, как говорят, имеетактивное повышение, если Date.now() больше boost.startTime() и меньше boost.stopTime().

Какую агрегацию в Монго я могу написать, чтобы получить все токены рядом с конкретным местоположением, принадлежащим пользователям по крайней мере с однимактивный буст?

1 Ответ

0 голосов
/ 11 сентября 2018

На основании вашего вопроса я создал фиктивные данные

token collection:
{
    "_id" : ObjectId("5b97541c6af22cc65216ffd8"),
    "userid" : "5b9753726af22cc65216ffd6",
    "location" : {
        "longitude" : 80.250875,
        "latitude" : 13.052519
    }
},
{
    "_id" : ObjectId("5b97543a6af22cc65216ffd9"),
    "userid" : "5b97537e6af22cc65216ffd7",
    "location" : {
        "longitude" : 80.249995,
        "latitude" : 13.051819
    }
}

boost collection :
{
        "_id" : ObjectId("5b9754796af22cc65216ffda"),
        "startTime" : ISODate("2018-09-11T05:36:57.149Z"),
        "stopTime" : ISODate("2018-09-11T05:36:57.149Z"),
        "userid" : "5b9753726af22cc65216ffd6"
    },
    {
        "_id" : ObjectId("5b9754b46af22cc65216ffdb"),
        "startTime" : ISODate("2018-10-08T18:30:00.000Z"),
        "stopTime" : ISODate("2018-10-08T18:30:00.000Z"),
        "userid" : "5b97537e6af22cc65216ffd7"
    }

Users collection :
{
            "_id" : ObjectId("5b9753726af22cc65216ffd6"),
            "userName" : "user111"
        },
        {
            "_id" : ObjectId("5b97537e6af22cc65216ffd7"),
            "userName" : "user222"
        }

Совокупный запрос для извлечения всех токенов рядом с конкретным местоположением, которые принадлежат пользователям с хотя бы одним активным повышением:

 db.token.aggregate([
{
     "$geoNear": {
        "near": { type: "Point", coordinates: [80.248797,13.050599] },
        "distanceField": "location",
        "maxDistance": 1000,
        "includeLocs": "location",
        "spherical": true
     }
   },
   {"$lookup" : {"from":"boost",
                 "localField" : "userid",
                "foreignField" : "userid",
                 "as" : "boostDocs"
      }},
   {"$unwind" : "$boostDocs"},
   {"$match" : {"$and":[{"boostDocs.startTime":{"$lte":new Date("11/09/2018")}},{"boostDocs.stopTime":{"$gte":new Date("10/09/2018")}}]}}
   ])

Обратите внимание, что запрос, соответствующий местоположению, находится в верхней части запроса, поскольку $ geoNear будет работать только в том случае, если это первый этап конвейера агрегации. Дата, которую я использовал для сравнения, просто проверяет, работает ли мой запрос. Вы можете указать свою дату или Date.now () согласно вашему требованию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...