Невозможно использовать линейную строку в агрегации $ geoNear - PullRequest
0 голосов
/ 05 мая 2019

Я пытаюсь использовать LineString в $ geoNear в запросе агрегации, но не могу его использовать.Я хочу, чтобы любая другая альтернатива использовала LineString для сравнения списка координат.

это моя функция:

function SentNotifications(coordinates,userid,startdate,enddate)
{
    var listofusers=[];
    console.log(coordinates);
    TripCoordinatesData.aggregate([
        {
            $geoNear: {
              near: { type: "Point", coordinates: coordinates},
              distanceField: "calculated",
              maxDistance: 2
           }
       },       
       { 
           $unwind: "$calculated" 
       },
        {
          $lookup:
            {
              from: "tripdatas",
              localField: "tripdata",
              foreignField: "_id",
              as: "trip"
            }
       },
       { $unwind: "$trip" },

       {
          $lookup:
            {
              from: "userdatas",
              localField: "trip.userdata",
              foreignField: "_id",
              as: "user"
            }
       },
         { $unwind: "$user" },

       {
            $match:
            {
                "trip.userdata":{$ne:mongoose.Types.ObjectId(userid)},
                "trip.createdon":{"$lte" : new Date(startdate)},
                "trip.createdon":{"$gte" : new Date(enddate)},

                //Logged in userid
                "trip.NotificationsSentTo": {$nin:[mongoose.Types.ObjectId(userid)]} 
            }
        },
//        {$group:{_id:{user:{firebaseToken:"$user.firebaseToken"}, trip:'$trip',calculated:'$calculated'}}}
        {$group:{ _id: null,
      users: {
        $addToSet: "$user.firebaseToken"
      }}}

     ],function(err,result){       
         console.log(result);
         console.log(err);

     });
}

Это мой запрос:

{
"id":"0",
"data":[ 
            [
            73.67368340492247,
            18.728638338108293
          ],
          [
            73.67421984672546,
            18.729959229560155
          ]
        ]
}

А вот как я передаю данные в функцию:

SentNotifications(req.body.data,tokenhelper.getUserFromToken(req.headers.token),Date.UTC("2019-05-04T00:00:00Z"),Date.UTC("2019-05-04T23:59:59Z"));

Вот мои монго-документы:

/* 1 */
{
    "_id" : ObjectId("5ccda8cd297d56360402ff82"),
    "location" : {
        "coordinates" : [ 
            [ 
                73.6736834049225, 
                18.7286383381083
            ], 
            [ 
                73.6742198467255, 
                18.7299592295602
            ]
        ],
        "type" : "LineString"
    },
    "tripdata" : ObjectId("5ccda8cd297d56360402ff81"),
    "createdon" : ISODate("2019-05-04T14:59:25.720Z"),
    "__v" : 0
}

/* 2 */
{
    "_id" : ObjectId("5ccda96344bdeb24bcdf66f6"),
    "location" : {
        "coordinates" : [ 
            [ 
                73.6736834049225, 
                18.7286383381083
            ], 
            [ 
                73.6742198467255, 
                18.7299592295602
            ]
        ],
        "type" : "LineString"
    },
    "tripdata" : ObjectId("5ccda96344bdeb24bcdf66f5"),
    "createdon" : ISODate("2019-05-04T15:01:55.942Z"),
    "__v" : 0
}

/* 3 */
{
    "_id" : ObjectId("5ccda98044bdeb24bcdf66f7"),
    "location" : {
        "coordinates" : [ 
            [ 
                73.6736834049225, 
                18.7286383381083
            ], 
            [ 
                73.6742198467255, 
                18.7299592295602
            ]
        ],
        "type" : "LineString"
    },
    "tripdata" : ObjectId("5ccda96344bdeb24bcdf66f5"),
    "createdon" : ISODate("2019-05-04T15:02:24.482Z"),
    "__v" : 0
}

Поэтому мне нужно решение, где я мог бы использовать линейную строку в статистической функции.Потому что я избегаю цикла for, поскольку это плохая практика.

Редактировать: я хочу сравнить две строки строк, одну из коллекции и одну из запроса, если расстояние между строками строк меньше или равно1000 метров, затем эта коллекция должна вернуться, это мое основное требование.

Редактировать 2: Я пробовал это:

     $geoNear:                                                                        
            {
              near: { type: "LineString", coordinates: coordinates},
              distanceField: "calculated",
              maxDistance: 2
           }  

Но получил эту ошибку:

{ MongoError: 'near' field must be point
    at Connection.<anonymous> (D:\Projects\TrackingApp\trackingapp\node_modules\mongoose\node_modules\mongodb-core\lib\connection\pool.js:443:61)
    at emitTwo (events.js:126:13)
    at Connection.emit (events.js:214:7)
    at processMessage (D:\Projects\TrackingApp\trackingapp\node_modules\mongoose\node_modules\mongodb-core\lib\connection\connection.js:364:10)
    at Socket.<anonymous> (D:\Projects\TrackingApp\trackingapp\node_modules\mongoose\node_modules\mongodb-core\lib\connection\connection.js:533:15)
    at emitOne (events.js:116:13)
    at Socket.emit (events.js:211:7)
    at addChunk (_stream_readable.js:263:12)
    at readableAddChunk (_stream_readable.js:250:11)
    at Socket.Readable.push (_stream_readable.js:208:10)
    at TCP.onread (net.js:594:20)
  ok: 0,
  errmsg: '\'near\' field must be point',
  code: 17304,
  codeName: 'Location17304',
  name: 'MongoError',
  [Symbol(mongoErrorContextSymbol)]: {} }   
...