Mongodb Stitch не поддерживает $ geoNear в collection.aggregate (). Альтернативный $ geoWithin не имеет includeLocs - PullRequest
0 голосов
/ 08 ноября 2018

$ geoNear соответствует ближайшему массиву в этом вопросе предлагается использовать $ geoNear и его опцию "includeLocs". Тем не менее, этот агрегат не поддерживается в функции MongoDb Stitch. Вы можете прочитать в документации https://docs.mongodb.com/stitch/mongodb/actions/collection.aggregate/#unsupported-aggregation-stages
В MongoDb Stitch я могу легко делать запросы с геопространственными данными, используя $ geoWithin. Но я не могу отделить свою модель возвращения. Есть ли альтернатива «includeLocs» или как я могу отфильтровать результат $ geoWithin?

Моя модель:

[
  {
    "locations": [
      {
        "address": "bla bla bla",
        "city": "Avila Beach",
        "coordinates": [
          -120.73605,
          35.17998
        ],
        "country": "Usa",
        "prods": [
          {
            "brand": "kumcho",
            "cagtegory": "tire",
            "id": "1_kumcho"
          },
          {
            "brand": "micheline",
            "cagtegory": "tire",
            "id": "1_micheline"
          },
          {
            "brand": "setrr",
            "cagtegory": "rim",
            "id": "1_setrr"
          }
        ],
        "state": "5 Cities"
      },
      {
        "address": "data data data",
        "city": "Arvin",
        "coordinates": [
            -118.84151,
            35.21617
        ],
        "country": "Usa",
        "prods": [
        ],
        "state": "Bakersfield",
      }
    ],
    "name": "My Car",
    "admin": "John"
  }
]

Согласно этой модели, когда я запрашиваю, как показано ниже.

.find({"locations.coordinates": {$geoWithin: {$centerSphere: [[-120.55361687164304, 35.22037830812648], 15/3963.2]}}},{"locations.coordinates":1})
.toArray() 

Совокупная альтернатива.

const pipeline = [
    {$match: {"locations.coordinates": {$geoWithin: {$centerSphere: [[-120.55361687164304, 35.22037830812648], 15/3963.2]}}}}
  ];

const cursor = coll.aggregate(pipeline);

результат:

[
  {
    "locations": [
      {
        "coordinates": [
          {
            "$numberDouble": "-120.73605"
          },
          {
            "$numberDouble": "35.17998"
          }
        ]
      },
      {
        "coordinates": [
          {
            "$numberDouble": "-118.84151"
          },
          {
            "$numberDouble": "35.21617"
          }
        ]
      }
    ]
  }
]

Но я хочу конкретный объект массива документа с корнем, который совпадает с искомыми координатами.

Например, мне нужно что-то подобное.

Поиск значений:
lon = -120.55361687164304
lat = 35.22037830812648
kmml = 3963.2 (это мили)
distance = 15

В соответствии с указанными выше поисковыми значениями, согласованные координаты модели:
"coordinates": [-120.73605, 35.17998]

Итак, я хочу, чтобы результат был примерно таким:

[
  {
    "locations": [
      {
        "address": "bla bla bla",
        "city": "Avila Beach",
        "coordinates": [
          -120.73605,
          35.17998
        ],
        "country": "Usa",
        "prods": [
          {
            "brand": "kumcho",
            "cagtegory": "tire",
            "id": "1_kumcho"
          },
          {
            "brand": "micheline",
            "cagtegory": "tire",
            "id": "1_micheline"
          },
          {
            "brand": "setrr",
            "cagtegory": "rim",
            "id": "1_setrr"
          }
        ],
        "state": "5 Cities"
      }
    ],
    "name": "My Car",
    "admin": "John"
  }
]

возможно ли вернуть определенные поля в документ mongodb?

Спасибо.

1 Ответ

0 голосов
/ 26 ноября 2018

geoNear устарела с версии 4.0. Вы можете попробовать использовать $ near $ geometry; https://docs.mongodb.com/manual/reference/operator/query/near/

 //Mile-Km to meters 
  if (kmml == 3963.2){
    distance = distance * 1609.344;
  }  else{
    distance = distance * 1000;
  }

    return coll
        .find({"location":{
              $near: {
                $geometry: {
                    type : "Point",
                    coordinates : [ lon, lat ]
              },
              $maxDistance: distance
            }
        }
        }).toArray();
...