MongoDB (JS), выполнять операции с запросами для одного свойства документа, если доступно, в противном случае взять другое свойство - PullRequest
0 голосов
/ 11 апреля 2019

Допустим, у меня есть следующие документы в моей коллекции "Запрос":

{
  pickup: {
    coords: null
  },
  meetup: {
    coords: [ someLng, someLat ]
  }
},
{
  pickup: {
    coords: null
  },
  meetup: {
    coords: [ someLng, someLat ]
  }
},
{
  pickup: {
    coords: [ someLng, someLat ]
  },
  meetup: {
    coords: [ someLng, someLat ]
  }
}

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

Если доступно pickup.coords, его следует использовать как ссылку на позицию для последующих выражений, в противном случае принять meetup.coords.

Я пытался использовать $cond, но я получаю сообщение об ошибке, и я не уверен, как именно его использовать.

Вот то, что я думал, может работать:

const query = {
  $cond: {
    if: {
     'pickup.coords': { $exists: true }
    },
    then: {
      // use pickup.coords as reference for distance to user
    },
    else: {
      // use meetup.coords as reference for distance to user
    }
  }
}

const requests = await Request.find( query )

Ошибка: unknown top level operator: $cond

В конце запрос будет намного сложнее, потому что я сделаю некоторую нумерацию страниц с limit и использую оператор $near с некоторым индексированием, я думаю. Но было бы неплохо сделать этот первый шаг: -)

Любая помощь будет принята с благодарностью!

1 Ответ

0 голосов
/ 11 апреля 2019

Измените ваше приложение для вставки документов в формате, который поддерживает ваши запросы. Добавьте еще одно поле, содержащее координаты, по которым вы будете искать:

{
    pickup: {
      coords: null
    },
    meetup: {
      coords: [ someLng, someLat ]
    },
    _search: {
      coords: [ someLng, someLat ]  
    }
  },
  {
    pickup: {
      coords: null
    },
    meetup: {
      coords: [ someLng1, someLat1 ]
    },
    _search: {
        coords: [ someLng1, someLat1 ]
    }
  },
  {
    pickup: {
      coords: [ someLng2, someLat2 ]
    },
    meetup: {
      coords: [ someLng3, someLat3 ]
    },
    _search: {
        coords: [ someLng2, someLat2 ]
    }
  }

Индекс в этом поле:

db.collection.createIndex( { _search : "2dsphere" } )

Поиск по этому полю:

db.collection.find(
   {
     _search: {
        $nearSphere: {
           $geometry: {
              type : "Point",
              coordinates : [  someLng4, someLat4 ]
           }
        }
     }
   }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...